57 lines
1.6 KiB
Python
57 lines
1.6 KiB
Python
from datetime import datetime
|
|
|
|
class LruCacheItem(object):
|
|
def __init__(self, key, value):
|
|
self.key = key
|
|
self.value = value
|
|
self.timestamp = datetime.now()
|
|
|
|
class LruCache(object):
|
|
def __init__(self, length, delta=None):
|
|
self.length = length
|
|
self.delta = delta
|
|
self.hash = {}
|
|
self.item_list = []
|
|
|
|
def insert_item(self, item):
|
|
if item.key in self.hash:
|
|
item_index = next(i for i, v in enumerate(self.item_list) if v.key == item.key)
|
|
self.item_list[:] = self.item_list[:item_index] + self.item_list[item_index+1:]
|
|
self.item_list.insert(0, item)
|
|
else:
|
|
if len(self.item_list) > self.length:
|
|
self.remove_item(self.item_list[-1])
|
|
self.hash[item.key] = item
|
|
self.item_list.insert(0, item)
|
|
|
|
def remove_all(self):
|
|
self.hash = {}
|
|
self.item_list = []
|
|
|
|
def remove_item(self, item):
|
|
del self.hash[item.key]
|
|
del self.item_list[self.item_list.index(item)]
|
|
|
|
def validate_item(self):
|
|
def _outdated_items():
|
|
now = datetime.now()
|
|
for item in self.item_list:
|
|
time_delta = now - item.timestamp
|
|
if time_delta.seconds > self.delta:
|
|
yield item
|
|
map(lambda x: self.remove_item(x), _outdated_items())
|
|
|
|
_cache = LruCache(length=100)
|
|
|
|
def purge():
|
|
_cache.remove_all()
|
|
|
|
def has(key):
|
|
return key in _cache.hash
|
|
|
|
def get(key):
|
|
return _cache.hash[key].value
|
|
|
|
def put(key, value):
|
|
_cache.insert_item(LruCacheItem(key, value))
|