获取Django中的缓存键列表

时间:2012-01-28 20:17:36

标签: python django caching memcached

我试图了解Django如何为我的观点设置密钥。我想知道是否有办法从Memcached获取所有保存的密钥。像cache.all()之类的东西。我一直试图找到cache.has_key('test')的密钥,但仍然无法弄清楚视图键的命名方式。

更新:我需要这个的原因是因为我需要手动删除部分缓存但不知道Django为我的cache_view键设置的键值

9 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

您可以使用来自https://github.com/dlrust/python-memcached-stats的memcached_stats。这个包使得可以在python环境中查看memcached键。

答案 2 :(得分:2)

切换为使用LocMemCache而不是MemcachedCache:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}

然后看到问题Contents of locmem cache in Django?

from django.core.cache.backends import locmem
print(locmem._caches)

答案 3 :(得分:1)

如上所述,无法获取django中所有缓存键的列表。如果您正在使用外部缓存(例如,memcached或数据库缓存),则可以直接检查外部缓存。

但是如果你想知道如何将django密钥转换为后端系统中使用的密钥,django的 make_key()函数将执行此操作。

https://docs.djangoproject.com/en/1.8/topics/cache/#cache-key-transformation

>>> from django.core.cache import caches
>>> caches['default'].make_key('test-key')
u':1:test-key'

答案 4 :(得分:1)

Memcached documentation recommends而不是列出所有缓存键,而是以详细模式运行memcached并查看所有更改的内容。您应该像这样启动memcached

memcached -vv

,然后它将在创建,更新/删除密钥时打印它们。

答案 5 :(得分:0)

如果这不是太过时,则我有类似的问题,因为我不得不遍历整个缓存。当我将某些内容添加到缓存中时(例如以下伪代码),我就对其进行了管理:

#create caches key list if not exists
if not my_cache.get("keys"):
    my_cache.set("keys", [])

#add to my cache
my_cache.set(key, value)

#add key to keys
if key not in my_cache.get("keys"):
    keys_list = my_cache.get("keys")
    keys_list.append(key)
    my_cache.set("keys", keys_list)

答案 6 :(得分:0)

对于RedisCache,您可以获得所有可用的密钥。

from django.core.cache import cache

cache.keys('*')

答案 7 :(得分:0)

这有帮助。

参考:

https://lzone.de/blog/How-to%20Dump%20Keys%20from%20Memcache

https://github.com/dlrust/python-memcached-stats

import re, telnetlib, sys

key_regex = re.compile(r"ITEM (.*) \[(.*); (.*)\]")
slab_regex = re.compile(r'STAT items:(.*):number')

class MemcachedStats:

    def __init__(self, host='localhost', port='11211'):
        self._host = host
        self._port = port
        self._client = None

    @property
    def client(self):
        if self._client is None:
            self._client = telnetlib.Telnet(self._host, self._port)
        return self._client

    def command(self, cmd):
        ' Write a command to telnet and return the response '
        self.client.write("{}\n".format(cmd).encode())
        res = self.client.read_until('END'.encode()).decode()
        return res

    def slab_ids(self):
        ' Return a list of slab ids in use '
        slab_ids =  slab_regex.findall(self.command('stats items'))
        slab_ids = list(set(slab_ids))
        return slab_ids

    def get_keys_on_slab(self, slab_id, limit=1000000):
        cmd = "stats cachedump {} {}".format(slab_id, limit)
        cmd_output = self.command(cmd)
        matches = key_regex.findall(cmd_output)
        keys = set()
        for match_line in matches:
            keys.add(match_line[0])
        return keys

    def get_all_keys(self):
        slab_ids = self.slab_ids()
        all_keys = set()
        for slab_id in slab_ids:
            all_keys.update(self.get_keys_on_slab(slab_id))
        return list(all_keys)


def main():
    m = MemcachedStats()
    print(m.get_all_keys())

if __name__ == '__main__':
    main()

答案 8 :(得分:-1)

有一些奇怪的解决方法可以从命令行获取所有键,但是没有办法在Django中使用memcached。请参阅this thread