8

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

key_x_y = value

像:

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

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

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

4

2 回答 2

16

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

编辑: 如果您已经在使用django-redis,那么您可以这样做

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

如此所述。

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

cache.get_many(cache.keys("key_1_*"))
于 2016-03-09T14:57:10.563 回答
2

如果cache有以下条目:

cache = {'key_1_3': 'foo', 'key_2_5': 'bar', 'key_1_7': 'baz'}

您可以获得所有具有 key 的条目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_*"))获取所有值。

于 2016-03-09T14:55:03.060 回答