【问题标题】:Django: Cached items not accessible between processes?Django:进程之间无法访问缓存项目?
【发布时间】:2025-11-21 16:00:01
【问题描述】:

我在使用 django 缓存时遇到问题。看起来缓存的项目不是 进程间可读。这是设计使然吗?我没有找到任何关于它的信息。

同时使用两个 ssh 会话在生产服务器上进行测试, 并使用 memcache 后端(也使用基于文件的后端进行了测试),结果如下:

(会话 1):

>>> from django.core.cache import cache
>>> cache.set('foo','bar')
>>> cache.get('foo')
'bar'

(第 2 节):

>>> from django.core.cache import cache
>>> cache.get('foo', 0) #Cache has not been set yet...
0
>>> cache.get('foo', 0) #Cache has been set in other session, I expect 'bar' here
0

我使用低级缓存api来缓存一个处理过的结果 上传的文件。用户然后完成一些描述 上传的数据,此时它被输入到数据库中。这个完成了 异步使用 apache2,每个进程一个线程,mod_wsgi 和 蟒蛇2.5。我遇到的问题是"cache.get('<filekey>')" 测试和上传文件时总是返回 None。

谢谢

【问题讨论】:

  • 不,这不是设计使然,您的示例应该可以工作。请检查您是否正确指定了缓存后端,并且“foo”存储在 memcached 中。
  • 嗯,这应该由cache.get 在与cache.set 相同的会话中验证,除非中间隐藏了另一个缓存层。
  • 这个问题你解决了吗?

标签: django caching


【解决方案1】:

Django 的缓存系统是几个不同缓存后端的抽象层。尽管它允许您使用相同的 API 与它们进行交互,但它们的行为会有所不同,具体取决于您配置的 API。详情请参阅documentation

您可以使用 settings.py 文件中的 CACHE_BACKEND 设置来配置要使用的后端。如果您不设置该设置,那么您将获得一个简单的进程内缓存,这将解释为什么您无法访问在其他进程中设置的缓存值。我建议您查看memcached 并使用它作为您的后端。它非常快速、可扩展且易于配置。

【讨论】:

  • 导入django.core.cache 时会自动加载django 设置模块(如果DJANGO_SETTINGS_MODULE env.var 设置不正确,它将不会导入),如果您阅读我的问题,我会说我测试了 memcached 和基于文件的后端。
  • 在这种情况下听起来像是缓存配置的问题。