我已经使用apache上托管的某个应用程序配置了johnny缓存。它配置了memcached作为后端,它在默认端口上的同一台机器上运行。
当多个Web客户端通过apache时,缓存可以正常工作。它们都从缓存中读取,任何更新都会使缓存失效。但是当python程序/脚本使用django(具有johnny配置的相同settings.py)从数据库读取时,它不会从缓存中读取,因此该程序所做的任何更新都不会影响缓存。这使得Web客户端从缓存中读取陈旧数据。
我还没有在johnny cache的相关文档中找到任何相关内容。有关这种情况的任何想法吗?
我正在使用johnny cache 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)重新获取对象时,我的脚本显示更新的值
谢谢,
答案 0 :(得分: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
答案 1 :(得分:3)
这是documentation的推荐方式:
from johnny.cache import enable
enable()
<强>更新强>
我观察到的,好像你的tasks.py文件在开头有这个,你不能再使用settings.py禁用johnny缓存了。