我对django的1.3版本有一些奇怪的缓存问题。我可能有错误的配置,但我不确定是什么。
一个很好的例子是django-avatar,它使用缓存并且许多人使用它。即使我没有定义缓存后端,avatar似乎也会被缓存,这本身就可以,但它会在最后缓存的值之间来回切换。示例:我上传了一个新的头像,现在大约50%的请求会显示新的头像,50%是旧的头像。如果我删除旧的,我仍然会在50%的时间在网站上获取它。修复它的唯一方法是通过将其设置为一秒来禁用头像的缓存。
首先我认为这是因为我使用了django.core.cache.backends.locmem.LocMemCache,这是我以前从未使用过的,但它甚至发生在我根本不配置缓存后端时。
我发现了一个类似的错误: Django caching bug .. even if caching is disabled
但我的网页渲染得很好,它的模板标签(现在)导致我的设置出现问题。
我使用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',但也遇到了同样的错误。
感谢您的帮助。
答案 0 :(得分:6)
很可能默认为内存缓存,这意味着每个工作人员在其自己的内存空间中拥有自己的缓存版本。如果您点击线程1,则获得一个不同的缓存,然后是线程3.Nginx正在通过循环分配在每个线程之间传播负载,因此您将更改每个命中的线程。这解释了你古怪的结果。
当你执行manage.py run_gunicorn时,它很可能运行单线程,因此只有一个缓存,这就是你没有看到相同结果的原因。
使用memcached或类似的东西是可行的方法。