class LocalCache(BaseCache): def __init__(self, backend, cache_conf): try: max_size = cache_conf.get('max_size', 128) ttl = cache_conf.get('ttl', 86400) self.cache = TTLCache(maxsize=max_size, ttl=ttl) except Exception: raise ERROR_CACHE_CONFIGURATION(backend=backend) def get(self, key): return self.cache.get(key) def set(self, key, value, expire=None): if expire: raise ERROR_CACHE_OPTION(method='cache.set', option='expire') self.cache[key] = value return True def delete(self, *keys): for key in keys: del self.cache[key] def flush(self, is_async=False): self.cache.popitem() self.cache.expire()
def popitem(self): key, val = TTLCache.popitem(self) evict = self.__evict if evict: evict(key, val) return key, val
class AutoTTLCache(MutableMapping): def __init__(self, items=None, *, maxsize, ttl, timer=time.monotonic, getsizeof=None): self._cache_lock = threading.Lock() self._cache = TTLCache(maxsize, ttl, timer=timer, getsizeof=getsizeof) if items is not None: self._cache.update(items) self._monitor = CacheMonitor(self) @property def ttl(self): with self._cache_lock: return self._cache.ttl @property def maxsize(self): with self._cache_lock: return self._cache.maxsize @property def timer(self): with self._cache_lock: return self._cache.timer def expire(self): with self._cache_lock: self._cache.expire() def __contains__(self, key): with self._cache_lock: return key in self._cache def __setitem__(self, k, v): with self._cache_lock: self._cache[k] = v def __delitem__(self, k): with self._cache_lock: del self._cache[k] def __getitem__(self, k): with self._cache_lock: return self._cache[k] def __len__(self) -> int: with self._cache_lock: return len(self._cache) def __iter__(self): with self._cache_lock: keys = list(self._cache) yield from keys # TODO: __reduce__ and __setstate__ def __repr__(self): return f"{type(self).__name__}(max_size={self.maxsize}, ttl={self.ttl})" def clear(self): with self._cache_lock: self._cache.clear() def get(self, *args, **kwargs): with self._cache_lock: self._cache.get(*args, **kwargs) def pop(self, *args, **kwargs): with self._cache_lock: self._cache.pop(*args, **kwargs) def setdefault(self, *args, **kwargs): with self._cache_lock: self._cache.setdefault(*args, **kwargs) def popitem(self): with self._cache_lock: self._cache.popitem()