如何使用本机django缓存匹配redis密钥模式?

时间:2016-03-09 14:46:51

标签: django django-caching

我有一系列遵循这种模式的缓存:

key_x_y = value

像:

  'key_1_3' = 'foo'
  'key_2_5' = 'bar'
  'key_1_7' = 'baz'

现在我想知道如何使用原生django key_1_*迭代所有键以匹配foo之类的模式以获取bazcache.get()

(我知道有办法,特别是for redis,允许使用更广泛的api,如iterate,但我想坚持使用vanilla django缓存,如果可能的话)

2 个答案:

答案 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')}

基于django-redis

的文档

您可以列出具有模式的所有键:

>>> 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_*"))一次性获取所有值。