0

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

我正在使用 Django 1.5.4,python 2.7.3。

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

设置.py

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

一些python.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”时,我得到了 None。

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

但是,如果我使用以下命令重新启动服务器 memcache:sudo service memcache restart,结果将丢失。

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

django 是否运行它自己的 memcache 守护进程?我对我的结果的去向感到非常困惑!

4

1 回答 1

1

使用以下内容:如何使用 python-memcache 从 memcached 中导出所有键和值?

并意识到 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
于 2013-10-21T19:16:53.430 回答