1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
# -*- coding: utf-8 -*-
import hashlib
from .tagged_cache import TaggedCache
from .utils import encode
class RedisTaggedCache(TaggedCache):
def forever(self, key, value):
"""
Store an item in the cache indefinitely.
:param key: The cache key
:type key: str
:param value: The value
:type value: mixed
"""
namespace = self._tags.get_namespace()
self._push_forever_keys(namespace, key)
self._store.forever(
'%s:%s' % (hashlib.sha1(encode(self._tags.get_namespace())).hexdigest(), key),
value
)
def flush(self):
"""
Remove all items from the cache.
"""
self._delete_forever_keys()
super(RedisTaggedCache, self).flush()
def _push_forever_keys(self, namespace, key):
"""
Store a copy of the full key for each namespace segment.
:type namespace: str
:type key: str
"""
full_key = '%s%s:%s' % (self.get_prefix(),
hashlib.sha1(encode(self._tags.get_namespace())).hexdigest(),
key)
for segment in namespace.split('|'):
self._store.connection().lpush(self._forever_key(segment), full_key)
def _delete_forever_keys(self):
"""
Delete all of the items that were stored forever.
"""
for segment in self._tags.get_namespace().split('|'):
segment = self._forever_key(segment)
self._delete_forever_values(segment)
self._store.connection().delete(segment)
def _delete_forever_values(self, forever_key):
"""
Delete all of the keys that have been stored forever.
:type forever_key: str
"""
forever = self._store.connection().lrange(forever_key, 0, -1)
if len(forever) > 0:
self._store.connection().delete(*forever)
def _forever_key(self, segment):
"""
Get the forever reference key for the segment.
:type segment: str
:rtype: str
"""
return '%s%s:forever' % (self.get_prefix(), segment)
|