3

我已经使用托管在 apache 上的应用程序之一配置了 johnny 缓存。它配置了 memcached 作为后端,在默认端口上运行在同一台机器上。

当多个 Web 客户端通过 apache 时,缓存工作正常。它们都从缓存中读取,任何更新都会使缓存失效。但是,当 python 程序/脚本使用 django(具有 johnny 配置的相同 settings.py)从数据库读取时,它不会从缓存中读取,因此该程序所做的任何更新都不会影响缓存。这让我不得不让 Web 客户端从缓存中读取陈旧的数据。

我在 johnny cache 的文档中没有找到与此相关的任何内容。对这种情况有什么想法吗?

我正在使用 johnny 缓存 0.3.3、django 1.2.5 和 python 2.7。

编辑: 要回答评论中的一个问题,我以这种方式从脚本中的数据库中读取-

>>> cmp = MyModelClass.objects.get(id=1)
>>> cmp.cust_field_2
u'aaaa'

我知道它不会从缓存中读取,因为我通过触发更新 sql 语句直接更新表,并且更新的值不会反映在我的 Web 客户端中,因为它仍然从缓存中读取。而当我使用 MyModelClass.objects.get(id=1) 重新获取对象时,我的脚本会显示更新的值

谢谢,

4

2 回答 2

4

当您运行脚本/管理命令时,似乎没有调用中间件,这就是您看到差异的原因。这在阅读有关中间件的文档时是有道理的,因为它处理请求和视图等自定义脚本中不存在的内容。

我找到了解决这个问题的方法,并且在 Johnny Cache bitbucket repo 中有一个关于它的问题。在您对数据库执行任何操作之前,在您的脚本中放置以下内容:

from johnny.middleware import QueryCacheMiddleware
qcm = QueryCacheMiddleware()

# put the code for you script here

qcm.unpatch()

你可以在这里看到更多:

https://bitbucket.org/jmoiron/johnny-cache/issue/49/offline-caching

和这里:

https://bitbucket.org/jmoiron/johnny-cache/issue/50/johhny-cache-not-active-in-management

于 2012-04-11T18:15:53.973 回答
3

这是文档中推荐的方法:

from johnny.cache import enable
enable()

更新:

我观察到,好像你的 tasks.py 文件一开始就有这个,你不能再使用 settings.py 禁用 johnny 缓存。

我已经报告了这个问题:https ://github.com/jmoiron/johnny-cache/issues/27

于 2012-12-21T20:25:41.217 回答