我有一系列遵循这种模式的缓存:
key_x_y = value
像:
'key_1_3' = 'foo'
'key_2_5' = 'bar'
'key_1_7' = 'baz'
现在我想知道如何使用原生django key_1_*
迭代所有键以匹配foo
之类的模式以获取baz
和cache.get()
?
(我知道有办法,特别是for redis,允许使用更广泛的api,如iterate
,但我想坚持使用vanilla django缓存,如果可能的话)
答案 0 :(得分:7)
使用标准Django的缓存包装器是不可能的。由于按模式搜索键的功能是后端相关操作,并且Django使用的所有缓存后端都不支持(例如,memcached不支持它,但Redis支持它)。因此,您必须使用具有支持此操作的缓存后端的自定义缓存包装。
修改强> 如果您已经在使用django-redis,那么您可以
from django.core.cache import cache
cache.keys("foo_*")
解释here。
这将返回与模式匹配的键列表,然后您可以使用cache.get_many()来获取这些键的值。
cache.get_many(cache.keys("key_1_*"))
答案 1 :(得分:2)
如果cache
有以下条目:
cache = {'key_1_3': 'foo', 'key_2_5': 'bar', 'key_1_7': 'baz'}
您可以获取包含密钥key_1_*
的所有条目:
x = {k: v for k, v in cache.items() if k.startswith('key_1')}
的文档
您可以列出具有模式的所有键:
>>> from django.core.cache import cache
>>> cache.keys("key_1_*")
# ["key_1_3", "key_1_7"]
获得密钥后,您可以从中获取值:
>>> [cache.get(k) for k in cache.keys("key_1_*")]
# ['foo', 'baz']
您也可以使用cache.iter_keys(pattern)
来有效实施。
或者,正如@Muhammad Tahir所建议的那样,您可以使用cache.get_many(cache.keys("key_1_*"))
一次性获取所有值。