gpt4 book ai didi

python - 如果我在我的 Flask 应用程序中使用 SimpleCache 会出什么问题

转载 作者:太空狗 更新时间:2023-10-30 00:02:35 27 4
gpt4 key购买 nike

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

不幸的是,文档说明如下:

"Simple memory cache for single process environments. This class exists mainly for the development server and is not 100% thread safe."

但是,我看不出线程安全在我们的设置中到底在哪里重要。我认为 Gunicorn 让几个 Flask worker 保持运行,每个 worker 都有自己的小缓存。可能会出什么问题?

最佳答案

我目前正在处理一个场景,在用户登录应用程序后,我想将他的 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]

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

cache = SimpleCache(threshold=1000, default_timeout=3600)

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

关于python - 如果我在我的 Flask 应用程序中使用 SimpleCache 会出什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28900091/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com