2012-11-05 137 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的出站流量限制。