def cached_fn(*args): key = "" data_bytes = "" #print(func.__name__) cache = LRUCache(size) fname = func.__name__ if (len(args) == 1): key = args[0] #print(key) if (len(args) == 2): key = args[0] data_bytes = args[1] if (fname == 'put' or fname == 'fibonacci'): temp = LRUCacheItem(key, data_bytes) cache.insertItem(temp) print("LRU--->Number of Users Cached=" + str(len(item_list))) retval = func(*args) if (fname == 'get' or fname == 'get_data'): hashval = cache.get() if key in hashval: item = hashval[key] data_bytes, key = serialize_GET(item) print("LRU Get-->") print(key) retval = key print(deserialize(data_bytes)) else: retval = func(*args) if (retval != None): print("Server Get --> Success") print(key) else: print("Server Get-->" + key + '--->KEY NOT FOUND') if (fname == 'delete'): if (cache.remove(key)): print("LRU Delete-->" + key) else: print("LRU Delete-->" + key + '--->KEY NOT FOUND') retval = func(*args) print("Server Delete-->" + key) return retval
class TinyLFU: def __init__(self, size=1000000, sample=100000, false_positive=0.01): self.__age = 0 self.__sample = sample self.counter = CM4(size) self.doorkeeper = Doorkeeper(sample, false_positive) if size <= 1: size = 2 # percentage from https://arxiv.org/abs/1512.00727 lru_percent = 1 lru_size = (lru_percent * size) / 100 if lru_size < 1: lru_size = 1 self.lru = LRUCache(cache_size=lru_size) slru_size = math.ceil(((100.0 - lru_percent) / 100.0) * size) slru20_size = math.ceil(slru_size * 0.2) if slru20_size < 1: slru20_size = 1 self.slru = SLRUCache(probation_cap=slru20_size, protect_cap=slru_size - slru20_size) def __len__(self) -> int: return len(self.lru) + len(self.slru) def __contains__(self, key) -> bool: return key in self.lru or key in self.slru def get(self, key: str): # for tinylfu aging, reset only admission self.__age += 1 if self.__age == self.__sample: self.counter.reset() self.doorkeeper.reset() self.__age = 0 self.counter.add(key) value = self.lru.get(key) if value != None: # timeout return value value = self.slru.get(key) if value != None: # timeout return value def set(self, key: str, value): if key in self.slru: self.slru.remove(key) old_key, old_value, evicted = self.lru.set(key, value) if not evicted: return victim_key = self.slru.victim() if victim_key == None: self.slru.set(old_key, old_value) return if not self.doorkeeper.allow(old_key): # on evict return victim_count = self.counter.estimate(victim_key) item_count = self.counter.estimate(old_key) if victim_count < item_count: self.slru.set(old_key, old_value) else: # on evict return def remove(self, key: str) -> object: value = self.lru.remove(key) if value != None: return value value = self.slru.remove(key) if value != None: return value