Source code for zsl.cache.redis_id_helper

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

.. moduleauthor:: Martin Babka <babka@atteq.com>
"""
import logging

from zsl import Config, inject
from zsl.cache.id_helper import IdHelper, decoder_identity, encoder_identity, model_key_generator
from zsl.cache.redis_cache_module import RedisCacheModule


[docs] class RedisIdHelper(IdHelper): CACHE_DEFAULT_TIMEOUT = 300 @inject(config=Config, redis_cache_module=RedisCacheModule) def __init__(self, config, redis_cache_module): """ Creates the id helper for caching support of AppModels. """ self._config = config self._redis_cache_module = redis_cache_module if 'CACHE_TIMEOUTS' in self._config: self._cache_timeouts = self._config['CACHE_TIMEOUTS'] else: self._cache_timeouts = None self._cache_default_timeout = self._config.get('CACHE_DEFAULT_TIMEOUT', RedisIdHelper.CACHE_DEFAULT_TIMEOUT)
[docs] def get_timeout(self, key, value, timeout): if self._cache_timeouts is None: return self._cache_default_timeout else: return self._cache_timeouts[timeout]
[docs] def gather_page(self, page_key, decoder=decoder_identity): page_keys = self._redis_cache_module.get_list(page_key) logging.debug("Fetching page {0} from redis using keys {1}.".format(page_key, page_keys)) p = [] for k in page_keys: p.append(decoder(k, self.get_key(k))) return p
[docs] def fill_page(self, page_key, data, timeout, encoder=encoder_identity, model_key_generator=model_key_generator): self._redis_cache_module.invalidate_key(page_key) first = True for d in data: key = model_key_generator(d) self._redis_cache_module.append_to_list(page_key, key) if first: self._redis_cache_module.set_key_expiration(page_key, self.get_timeout(page_key, data, timeout)) first = False self._redis_cache_module.set_key(key, encoder(d), self.get_timeout(key, d, timeout))
[docs] def check_page(self, page_key): if not self._redis_cache_module.contains_list(page_key): return False page_keys = self._redis_cache_module.get_list(page_key) for k in page_keys: if not self.check_key(k): return False return True
[docs] def check_key(self, key): return self._redis_cache_module.contains_key(key)
[docs] def get_key(self, key): return self._redis_cache_module.get_key(key)
[docs] def invalidate_key(self, key): return self._redis_cache_module.invalidate_key(key)
[docs] def invalidate_keys_by_prefix(self, key_prefix): return self._redis_cache_module.invalidate_by_glob(key_prefix + "*")
[docs] def set_key(self, key, value, timeout): self._redis_cache_module.set_key(key, value, self.get_timeout(key, value, timeout))