Django - Johnny Cache用于多个进程

时间:2012-04-11 06:25:04

标签: django django-cache

我已经使用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)重新获取对象时,我的脚本显示更新的值

谢谢,

2 个答案:

答案 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缓存了。

我已报告此问题:https://github.com/jmoiron/johnny-cache/issues/27