如何使用本机 Django 缓存匹配 Redis 键模式?

How to match redis key patterns using native django cache?

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

key_x_y = value

喜欢:

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

现在我想知道如何使用本机 django cache.get() 遍历所有键以匹配模式 key_1_* 以获得 foobaz

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

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

使用标准 Django 的缓存包装器是不可能的。由于按模式搜索键的功能是一个依赖于后端的操作,并不是 Django 使用的所有缓存后端都支持它(例如,memcached 不支持它,但 Redis 支持)。因此,您将不得不使用带有支持此操作的缓存后端的自定义缓存包装器。

编辑: 如果你已经在使用 django-redis 那么你可以做

from django.core.cache import cache
cache.keys("foo_*")

解释为 here

这将 return 与模式匹配的键列表,然后您可以使用 cache.get_many() 获取这些键的值。

cache.get_many(cache.keys("key_1_*"))