获取 Django 中的缓存键列表
我试图了解 Django 如何为我的视图设置键。我想知道是否有办法从 Memcached 获取所有保存的密钥。类似 cache.all()
之类的东西。我一直在尝试使用 cache.has_key('test')
查找键,但仍然无法弄清楚视图键是如何命名的。
更新:我需要这个的原因是因为我需要手动删除部分缓存,但不知道 Django 为我的 cache_view 键设置的键值
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
像这样的简单搜索将返回所有匹配的值。在具有大量键的数据库中,这不是合适的方法。相反,您可以使用 iter_keys 函数,该函数的工作方式类似于 keys 函数,但使用 Redis 服务器端游标。调用 iter_keys 将返回一个生成器,然后您可以有效地迭代该生成器。
https://github.com/jazzband/django-redis #scan--批量删除密钥
A simple search like this will return all matched values. In databases with a large number of keys this isn't suitable method. Instead, you can use the iter_keys function that works like the keys function but uses Redis server side cursors. Calling iter_keys will return a generator that you can then iterate over efficiently.
https://github.com/jazzband/django-redis#scan--delete-keys-in-bulk
这有帮助。
参考:
https://lzone.de/blog/How-to% 20Dump%20Keys%20from%20Memcache
https://github.com/dlrust/python-memcached-stats
this helps.
Ref:
https://lzone.de/blog/How-to%20Dump%20Keys%20from%20Memcache
https://github.com/dlrust/python-memcached-stats
您可以使用
cache._cache.keys()
以相反的顺序获取 LocMemCache。例如,您设置了 4 个缓存值,如下所示:
然后,您可以使用
cache._cache.keys()
以相反的顺序获取所有键,如下所示。 * 每个键之前的:1:
、:2:
或:3:
表示版本:并且,您可以迭代所有键,如下所示:
输出:
并且,您可以迭代所有具有版本的键,如下所示:
输出:
最后,您可以迭代与键和版本匹配的所有键值,如下所示。 *
缓存需要list()。 _cache.keys()
否则你会得到错误并且需要为cache.delete() 否则你无法删除所有缓存值和答案 中的一个href="https://stackoverflow.com/questions/76936038/does-cache-set-use-version-1-by-default-instead-of-version-none-in-djang">我的问题使用LocMemCache
解释缓存值的默认版本:输出:
You can get all keys with
cache._cache.keys()
in reverse order for LocMemCache.For example, you set 4 cache values as shown below:
Then, you can get all the keys with
cache._cache.keys()
in reverse order as shown below. *:1:
,:2:
or:3:
before each key indicates version:And, you can iterate all the keys as shown below:
Output:
And, you can iterate all the keys with the versions as shown below:
Output:
Lastly, you can iterate all the key's values which match the keys and versions as shown below. *list() is needed for
cache._cache.keys()
otherwise you get error and specifying a version is needed for cache.delete() otherwise you cannot delete all the cache values and the answer of my question explains the default version of a cache value withLocMemCache
:Output:
您可以使用一些奇怪的解决方法来从命令行获取所有密钥,但无法使用 Django 内部的 memcached 来执行此操作。请参阅此帖子。
There are some weird workarounds you can do to get all keys from the command line, but there is no way to do this with memcached inside of Django. See this thread.
对于 RedisCache 您可以获得所有可用的密钥。
For RedisCache you can get all available keys with.
如前所述,无法获取 django 中所有缓存键的列表。如果您使用外部缓存(例如memcached或数据库缓存),您可以直接检查外部缓存。
但是如果你想知道如何将 django 密钥转换为后端系统中使用的密钥,django 的 make_key() 函数可以做到这一点。
https://docs.djangoproject.com/en/1.8/主题/缓存/#cache-key-transformation
As mentioned there is no way to get a list of all cache keys within django. If you're using an external cache (e.g. memcached, or database caching) you can inspect the external cache directly.
But if you want to know how to convert a django key to the one used in the backend system, django's make_key() function will do this.
https://docs.djangoproject.com/en/1.8/topics/cache/#cache-key-transformation
对于 Redis 后端,
我将添加这个答案,因为我遇到了这个 SO 问题,搜索完全相同的问题,但使用不同的缓存后端。另外,对于 REDIS,特别是如果您为多个应用程序使用相同的 REDIS 服务器,您将需要使用 KEY_PREFIX 选项来确定缓存键的范围,否则您最终可能会得到来自另一个应用程序的缓存键。
我的答案是如果您在
settings.py
中设置了KEY_PREFIX
并且您使用的是redis_cache.RedisCache
或django。 core.cache.backends.redis.RedisCache
例如
或
redis_cache.RedisCache
django.core.cache.backends.redis.RedisCache
奖励:删除所有应用程序密钥
如果您想清除特定应用程序的缓存而不是全部 您需要使用先前技术的 REDIS 中的键,然后调用
cache.delete_many(cache_keys)
而不是cache.clear()
作为 Django Docs 警告使用cache.clear() 将删除缓存中的所有键,而不仅仅是应用程序创建的键。
For Redis Backend
I'm going to add this answer because I landed on this SO question searching for exactly the same question but using a different cache backend. Also with REDIS in particular if you are using the same REDIS server for multiple applications you will want to scope your cache keys with the
KEY_PREFIX
option otherwise you could end up with cache keys from another application.My answer is for if you have setup
KEY_PREFIX
in yoursettings.py
and if you are using eitherredis_cache.RedisCache
ordjango.core.cache.backends.redis.RedisCache
e.g.
or
redis_cache.RedisCache
django.core.cache.backends.redis.RedisCache
Bonus: Deleting all app keys
If you want to clear the cache for your specific app instead of ALL the keys in REDIS you'll want to using the prior technique and then call
cache.delete_many(cache_keys)
instead ofcache.clear()
as the Django Docs warns that usingcache.clear()
will remove ALL keys in your cache, not just the ones that are created by your app.为了调试,您可以暂时切换到
LocMemCache< /code>
而不是
PyMemcacheCache
:然后查看这个问题:
For debugging, you can temporarily switch to
LocMemCache
instead ofPyMemcacheCache
:then see this question:
在我使用 Django 3.2 的设置中,有一种方法可以获取 Redis 的“原始”客户端,您可以从中获取密钥。
In my setup with Django 3.2 there is a method to get a "raw" client for Redis which you can get the keys from.
Memcached 文档建议列出所有缓存键后,您可以在详细模式下运行 memcached 并查看所有发生更改的内容。您应该像这样启动 memcached
,然后它会在创建/更新/删除密钥时打印它们。
The Memcached documentation recommends that instead of listing all the cache keys, you run memcached in verbose mode and see everything that gets changed. You should start memcached like this
and then it will print the keys as they get created/updated/deleted.
您可以使用 http://www.darkcoding.net/software/memcached- list-all-keys/ 如 如何检查Django 缓存与 Python memcached?
You can use http://www.darkcoding.net/software/memcached-list-all-keys/ as explained in How do I check the content of a Django cache with Python memcached?
您可以使用以下位置的 memcached_stats: https://github.com/dlrust/python-memcached-stats。该包使得可以从 python 环境中查看 memcached 密钥。
You can use memcached_stats from: https://github.com/dlrust/python-memcached-stats. This package makes it possible to view the memcached keys from within the python environment.
如果这不是太过时,我也遇到过类似的问题,因为我必须迭代整个缓存。当我向缓存中添加一些内容时,我成功了,如下伪代码所示:
If this is not too out of date, I have had similar issue, due I have had to iterate over whole cache. I managed it, when I add something to my cache like in following pseudocode: