如果我在Flask应用程序中使用SimpleCache怎么办?

Ale*_*exC 6 python caching flask python-2.7 gunicorn

我们使用以下设置:NGINX + Gunicorn + Flask。我们只需要添加一点缓存,每个Flask工作者不超过5Mb。SimpleCache似乎是最简单的解决方案-它在Python进程本身内部本地使用内存。

不幸的是,文档指出以下内容:

“用于单进程环境的简单内存缓存。此类主要存在于开发服务器中,并且不是100%线程安全的。”

但是,我看不到在我们的设置中线程安全到底有多重要。我认为Gunicorn可以让数个Flask工人保持运转,每个工人都有自己的小缓存。可能出什么问题了?

ram*_*amu 4

我目前正在处理一个场景,在用户登录应用程序后,我想将他的 IP、用户名插入数据库。

现在,我只能执行一次的方法是使用缓存将用户的 ip 和用户名存储在缓存中。

现在,当每个gunicorn进程初始化自己的缓存时,问题就出现了。如果为 proc1 的缓存添加用户名+ip 组合,如果 proc2 拾取同一用户的下一个请求,它将在其缓存中找不到它,因此再次将其添加到其缓存和数据库中,这是不合适的。因此,在这种情况下,线程安全(进程安全)缓存非常重要。

日志示例:

2015-07-07 22:42:31 - myapp.views:29 - DEBUG - not from cache user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:31 - myapp.views:30 - DEBUG - from cache : user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:40 - myapp.views:29 - DEBUG - not from cache user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:40 - myapp.views:30 - DEBUG - from cache : user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:41 - myapp.views:29 - DEBUG - not from cache user1100.100.100.100, <type 'unicode'> [14779]
2015-07-07 22:42:41 - myapp.views:30 - DEBUG - from cache : None, <type 'NoneType'> [14779]
2015-07-07 22:42:41 - myapp.views:32 - DEBUG - new username ip [14779]
2015-07-07 22:42:41 - myapp.views:38 - DEBUG - User : user1, ip : 100.100.100.100, noted at time : Tue Jul  7 22:42:41 2015, login_count : None [14779]
Run Code Online (Sandbox Code Playgroud)

您可以看到gunicorn进程14776首先将其添加到其缓存中,然后下一个请求被14776选择,因此数据库条目仅发生一次,但之后下一个请求被14779选择,将其添加到其缓存中,因此数据库条目。

cache = SimpleCache(threshold=1000, default_timeout=3600)
Run Code Online (Sandbox Code Playgroud)

使用基于 memcache 或 redis 的缓存可能会解决这个问题。我自己正在尝试这样做。