如何使用本机 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_*
以获得 foo
和 baz
?
(我知道有一些方法,特别是 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_*"))
我有一系列遵循这种模式的缓存:
key_x_y = value
喜欢:
'key_1_3' = 'foo'
'key_2_5' = 'bar'
'key_1_7' = 'baz'
现在我想知道如何使用本机 django cache.get()
遍历所有键以匹配模式 key_1_*
以获得 foo
和 baz
?
(我知道有一些方法,特别是 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_*"))