2012-11-05 78 views
1

问题是nginx没有获取memcached中存在的memcached密钥,每当我请求链接时都会发生这种情况。nginx无法从memcahed中获取密钥

的分布式缓存的日志:

与关键 “位点/链接” 到分布式缓存zhcon失败Nginx的请求:(但关键数据在分布式缓存)

<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的与键 “定点/链接” 请求成功memcached的取数据

<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:

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

从memcached的日志,你的nginx的是这样做的:

get site-/links 

,而你的Django是这样做的:

get :1:site-/links 

注:这些都不是相同的密钥,Django的一个具有:1:在前面! (该:1:是propably自动添加的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; 
} 
0

我用的是相同的设置,这是一个问题。

Django的缓存使用世代缓存并在密钥生成器中放置一个前缀。

您需要做的是确保您set from django.core.cache.cache._cache < - 内部memcached绑定。

from django.core.cache import cache 

cache._cache.set(...) 

要决定我用DummyCache当地环境这项工作,我的子类DummyCache与属性_cache返回本身。 PS:为荒谬的表演做准备。目前我受限于100MB的出站流量限制。