コード例 #1
0
        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
コード例 #2
0
ファイル: tinylfu.py プロジェクト: s8508235/py3-tinylfu
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