nginx无法从memcached中获取密钥

时间:2012-11-05 18:44:01

标签: django nginx memcached

问题是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?

2 个答案:

答案 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子类化,并返回自身。

PS:准备好做出荒谬的表演。我目前受限100mbits的出站流量上限。