4

我在 1.3 版本的 django 上遇到了奇怪的缓存问题。我可能有一些配置错误,但不确定是什么。

一个很好的例子是 django-avatar,它使用缓存并且很多人使用它。即使我没有定义缓存后端,头像似乎已被缓存,这本身就可以,但它会不断在缓存的最后一个值之间来回切换。示例:我上传了一个新头像,现在大约 50% 的请求会显示新头像,50% 显示旧头像。如果我删除旧的,我仍有 50% 的时间会在网站上看到它。修复它的唯一方法是通过将其设置为一秒来禁用头像的缓存。

首先我认为这是因为我使用了 django.core.cache.backends.locmem.LocMemCache,我以前从未使用过,但是当我根本没有配置缓存后端时它甚至会发生。

我发现了一个类似的错误: Django缓存错误..即使缓存被禁用

但是我的页面渲染得很好,它的模板标签(现在)会导致我的设置出现问题。

我使用 django 1.3、postgres、nginx、gunicorn 0.12.0、greenlet==0.3.1、eventlet==0.9.16

我只是做了一些更多的测试,并意识到它只有在我使用配置文件启动 gunicorn 时才会发生。如果我从 ./manage.py run_gunicorn 开始,一切都很好。运行“gunicorn_django -c deploy/gunicorn.conf.py”会导致问题。

我能想到的唯一解释是每个工人都有自己的缓存(我想知道为什么,因为我没有定义缓存)。

更新:运行 ./manage.py run_gunicorn -w 4 也会导致同样的问题。因此,我几乎可以肯定是多个工作人员导致了问题,并且每个工作人员分别缓存了这些值。

我的配置:

import os
import socket
import sys

PORT = 8000
PROC_NAME = 'myapp_gunicorn'
LOGFILE_NAME = 'gunicorn.log'
TIMEOUT = 3600
IP = '127.0.0.1'
DEPLOYMENT_ROOT = os.path.dirname(os.path.abspath(__file__))
SITE_ROOT = os.path.abspath(os.path.sep.join([DEPLOYMENT_ROOT, '..']))
CPU_CORES = os.sysconf("SC_NPROCESSORS_ONLN")
sys.path.insert(0, os.path.join(SITE_ROOT, "apps"))
bind = '%s:%s' % (IP, PORT)
logfile = os.path.sep.join([DEPLOYMENT_ROOT, 'logs', LOGFILE_NAME])
proc_name = PROC_NAME
timeout = TIMEOUT
worker_class = 'eventlet'
workers = 2 * CPU_CORES + 1

我也尝试过不使用'eventlet',但得到了同样的错误。

谢谢你的帮助。

4

1 回答 1

9

它很可能默认为内存缓存,这意味着每个工作人员在自己的内存空间中都有自己的缓存版本。如果您点击线程 1,您将获得与线程 3 不同的缓存。Nginx 很可能通过循环分配在每个线程之间分配负载,因此您每次点击都在更改线程。这解释了你古怪的结果。

当您执行 manage.py run_gunicorn 时,它很可能运行单线程,因此只有一个缓存,这就是您看不到相同结果的原因。

使用 memcached 或类似的东西是要走的路。

于 2011-06-21T10:44:15.307 回答