Django + memcached,结果不在服务器上

时间:2013-10-21 19:06:53

标签: django memcached

我正在尝试将值“name2”保存到Django的memcache中并获得...有趣的结果。

我使用的是Django 1.5.4。,pythn 2.7.3。

我目前的设置:
在我的django.settings文件中:

settings.py

CACHES = {
'default': {
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    'LOCATION': '123.123.123.123:11211',
    }
}

somepython.py

import memcache
def heavy_view2():
    s = memcache.Client(['123.123.123.123:11211'])
#     s.set("name", "david");
    return s.get("name1")

所以对于一切标准,当我去我的服务器并设置memcache值“name1”时,我可以从我的机器上拉下来!

现在使用Django:

from django.core.cache import cache
def heavy_view():
    cache_key = 'name'
    result = cache.get(cache_key)
    return result
>>>> print(heavy_view())
>>>> None

这很奇怪!特别是因为我设置了“名称”服务器端! 可是等等!当我这样做时:

from django.core.cache import cache
def heavy_view():
    cache_key = 'name1'
    cache_time = 100 # time to live in seconds
    if not result:# some calculations here
        print('set name1')
        result = 'tbone'
        cache.set(cache_key, result, 100)
return result

>>>> heavy_view()
>>>> 'set name1'
>>>> r = heavy_view()
>>>> 'tbone'

但是当我回到我的服务器并请求“name1”时,我得到了无。

使用heavy_view()的后续调用返回我的“缓存”结果。

但是如果我使用:sudo service memcache restart重新启动服务器内存缓存,则结果是LOST。

尽管如此,在SERVER上查找“name1”始终返回None。

django运行它自己的memcache守护进程吗?我对结果的发展感到非常困惑!

1 个答案:

答案 0 :(得分:0)

使用以下内容:How to export all keys and values from memcached with python-memcache?

并意识到Django正在添加“:1:”+键名。

import telnetlib

def get_all_memcached_keys(host='127.0.0.1', port=11211):
    t = telnetlib.Telnet(host, port)
    t.write('stats items STAT items:0:number 0 END\n')
    items = t.read_until('END').split('\r\n')
    keys = set()
    for item in items:
        parts = item.split(':')
        if not len(parts) >= 3:
            continue
        slab = parts[1]
        t.write('stats cachedump {} 200000 ITEM views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s] END\n'.format(slab))
        cachelines = t.read_until('END').split('\r\n')
        for line in cachelines:
            parts = line.split(' ')
            if not len(parts) >= 3:
                continue
            keys.add(parts[1])
    t.close()
    return keys