Source code for zsl.cache.redis_cache_module

"""
:mod:`zsl.cache.redis_cache_module`
-----------------------------------

.. moduleauthor:: Martin Babka
"""
import redis

from zsl import Config, Zsl, inject
from zsl.cache.cache_module import CacheModule


[docs] class RedisCacheModule(CacheModule): """Abstraction layer for caching.""" @inject(app=Zsl, config=Config) def __init__(self, app, config): """Abstraction layer for caching.""" self._app = app self._config = config redis_conf = self._config.get('REDIS', {}) self._client = redis.StrictRedis( host=redis_conf.get('host'), port=redis_conf.get('port'), db=redis_conf.get('db', 0), password=redis_conf.get('password') ) self.logger = self._app.logger.getChild('cache') self.logger.debug("Redis client created.") self._cache_prefix = self._config[ 'CACHE_PREFIX'] + ':' if 'CACHE_PREFIX' in self._config else '' def _prefix_key(self, key): return self._cache_prefix + key
[docs] def set_key(self, key, value, timeout): pkey = self._prefix_key(key) self._client.set(pkey, value) self.set_key_expiration(key, timeout)
[docs] def invalidate_key(self, key): pkey = self._prefix_key(key) self.logger.debug("Key invalidation '{0}'.".format(key)) self._client.delete(pkey)
[docs] def set_key_expiration(self, key, timeout): pkey = self._prefix_key(key) self.logger.debug("Key expiration '{0}' = {1}.".format(key, timeout)) self._client.expire(pkey, timeout)
[docs] def contains_key(self, key): pkey = self._prefix_key(key) return self._client.exists(pkey)
[docs] def contains_list(self, key): pkey = self._prefix_key(key) return self._client.exists(pkey)
[docs] def get_key(self, key): pkey = self._prefix_key(key) return self._client.get(pkey)
[docs] def append_to_list(self, key, value): pkey = self._prefix_key(key) self._client.rpush(pkey, value)
[docs] def get_list(self, key): pkey = self._prefix_key(key) llen = self._client.llen(pkey) return self._client.lrange(pkey, 0, llen - 1)
[docs] def invalidate_by_glob(self, glob): pglob = self._prefix_key(glob) if self._config.get('IS_USING_MEDIEVAL_SOFTWARE', False): keylist = self._client.keys(pglob) else: keylist = self._client.scan_iter(pglob) for key in keylist: # This does not need to prefixed. self.logger.debug('Invalidating key {0}.'.format(key)) self._client.delete(key)