8

このパターンに従う一連のキャッシュがあります。

key_x_y = value

お気に入り:

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

今、ネイティブ djangokey_1_*を取得fooして使用するようなパターンに一致するようにすべてのキーを反復処理するにはどうすればよいでしょうか?bazcache.get()

(特にredisの場合、 のようなより広範な API を使用できる方法があることは知っていますが、可能であれば、iterateバニラの 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 に答える