获取Django中的缓存键列表

Bre*_*den 24 python django memcached caching

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

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

Edu*_*ans 22

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

from django.core.cache import cache

cache.keys('*')
Run Code Online (Sandbox Code Playgroud)

  • “RedisCache”对象没有属性“keys” (7认同)
  • @KaramHaj `cache.get('*')` 返回 `None` 而不是像 `cache.keys('*')` 这样的每个键。在 django 3.2.3 和 redis 3.5.3 上测试 (7认同)
  • @KaramHaj我认为对于较新的版本,你可以尝试使用 `cache.get('*')` (3认同)
  • 这个答案不适用于 Django 4+ 提供的“RedisCache”,请参阅下面我的答案以了解更多详细信息。 (3认同)

小智 7

如前所述,无法获取 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'
Run Code Online (Sandbox Code Playgroud)


小智 7

为了进行调试,您可以暂时切换到LocMemCache而不是PyMemcacheCache

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}
Run Code Online (Sandbox Code Playgroud)

然后看到这个问题

from django.core.cache.backends import locmem
print(locmem._caches)
Run Code Online (Sandbox Code Playgroud)


JJK*_*JJK 7

对于Redis后端

我要添加这个答案,因为我遇到了这个SO问题,搜索完全相同的问题,但使用不同的缓存后端。另外,对于 REDIS,特别是如果您为多个应用程序使用相同的 REDIS 服务器,您将需要使用该选项来确定缓存键的范围KEY_PREFIX,否则您最终可能会得到来自另一个应用程序的缓存键。

我的答案是如果您已经进行了设置KEY_PREFIX并且settings.py您正在使用redis_cache.RedisCachedjango.core.cache.backends.redis.RedisCache

例如

 CACHES = {
    "default": {
        "BACKEND": "redis_cache.RedisCache",
        "LOCATION": f"redis://localhost:6379",
        "KEY_PREFIX": "my_prefix",
    },
 }
Run Code Online (Sandbox Code Playgroud)

或者

 CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.redis.RedisCache",
        "LOCATION": f"redis://localhost:6379",
        "KEY_PREFIX": "my_prefix",
    },
 }
Run Code Online (Sandbox Code Playgroud)

redis_cache.RedisCache

from django.conf import settings
from django.core.cache import cache

cache_keys = cache.get_client(1).keys(
   f"*{settings.CACHES['default']['KEY_PREFIX']}*"
)
Run Code Online (Sandbox Code Playgroud)

django.core.cache.backends.redis.RedisCache

做一些测试表明,使用 Django 内置的 RedisCache 可能已经被限定了范围,但在我的例子中,我这样做是为了明确。调用.keys("*")还将返回属于 celery 任务的键

from django.conf import settings
from django.core.cache import cache

cache_keys = cache._cache.get_client().keys(
    f"*{settings.CACHES['default']['KEY_PREFIX']}*"
)
Run Code Online (Sandbox Code Playgroud)

奖励:删除所有应用程序密钥

如果您想清除特定应用程序的缓存而不是REDIS 中的所有键,您将需要使用先前的技术,然后调用cache.delete_many(cache_keys)而不是像Django 文档cache.clear()警告的那样,使用将删除缓存中的所有键,而不仅仅是由您的应用程序创建的。cache.clear()