File: redis_tagged_cache.py

package info (click to toggle)
cachy 0.3.0-3
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 264 kB
  • sloc: python: 1,319; sh: 6; makefile: 4
file content (80 lines) | stat: -rw-r--r-- 2,171 bytes parent folder | download | duplicates (2)
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)