问题是nginx没有获取memcached中存在的memcached密钥,每次我请求链接时都会发生这种情况。
memcached日志:
使用密钥“site- / links”到memcached faild的Nginx请求:(但是memcached中的关键数据)
<31 new auto-negotiating client connection
31: Client using the ascii protocol
<31 get site-/links ### NO DATA SEND! but it in cache
>31 END
<31 connection closed.
Django请求密钥“site- / links”获取数据成功
<31 get :1:mkey
>31 sending key :1:mkeys 0 4
mval
(dp1
.
>31 END
<31 get :1:site-/links
>31 sending key :1:site-/links ###data send!
>31 END
<31 set :1:site-/links 0 300 5518
>31 STORED
<31 set :1:mkey 0 300 4
>31 STORED
<31 connection closed.
我的nginx cfg for memcached:
location / {
default_type "text/html; charset=utf-8";
set $memcached_key site-$uri;
memcached_pass 127.0.0.1:11211;
error_page 404 502 = @django;
}
location @django {
include uwsgi_params;
uwsgi_pass unix:///var/tmp/site.sock;
}
django middlware:
class NginxMemCacheMiddleWare(object):
def process_response(self, request, response):
cacheIt = True
theUrl = request.get_full_path()
# if it's a GET then store it in the cache:
if request.method != 'GET':
cacheIt = False
# loop on our CACHE_INGORE_REGEXPS and ignore
# certain urls.
for exp in settings.CACHE_IGNORE_REGEXPS:
if re.match(exp,theUrl):
cacheIt = False
if cacheIt:
key = '%s-%s' % (settings.CACHE_KEY_PREFIX,theUrl)
#key = theUrl
print "CACHE!"
print key
print "MKEY:",cache.get("mkey")
print cache.get(key)
cache.set(key,response.content)
cache.set("mkey","mval")
return response
那么为什么nginx无法使用memcached中的密钥获取数据并总是转到django uwsgi?
答案 0 :(得分:0)
来自你的memcached日志,你的nginx正在做:
get site-/links
当你的django正在做的时候:
get :1:site-/links
注意:那些不是相同的键,django前面有:1:
!
(:1:
可以由django自动添加为一种名称空间)
换句话说,更改你的ningx配置以匹配以下location
- 阻止:
location / {
default_type "text/html; charset=utf-8";
set $memcached_key :1:site-$uri;
memcached_pass 127.0.0.1:11211;
error_page 404 502 = @django;
}
答案 1 :(得分:0)
我使用相同的设置,这是一个问题。
Django的缓存使用分代缓存并在密钥生成器中放置前缀。
您需要做的是确保来自set
&lt; - 内部memcached绑定的django.core.cache.cache._cache
。
from django.core.cache import cache
cache._cache.set(...)
要在我使用DummyCache
的本地环境中进行此操作,我已经使用属性DummyCache
将_cache
子类化,并返回自身。