旺苍网站建设,海南房产网,小型企业互联网解决方案,怎样注册小程序文章目录 cachetools缓存策略缓存操作 TTLCache cachetools是一个Python第三方库#xff0c;提供了多种缓存算法的实现。
cachetools
使用前需要先安装pip install cachetools#xff0c;说明文档参见https://cachetools.readthedocs.io/en/latest/。
cachetools提供了五种… 文章目录 cachetools缓存策略缓存操作 TTLCache cachetools是一个Python第三方库提供了多种缓存算法的实现。
cachetools
使用前需要先安装pip install cachetools说明文档参见https://cachetools.readthedocs.io/en/latest/。
cachetools提供了五种缓存类型
CachedLRUCacheTTLCacheLFUCacheRRCache
缓存策略
cachetools提供了以下常见的缓存策略当需要为新的条目腾出空间时如何移除已有条目
Least Recently Used (LRU): 移除最近最少使用的条目这是一种常见的缓存策略适用于大多数场景。Most Recently Used (MRU): 移除最近最常使用的条目这种策略适用于一些特殊场景例如当最近访问的数据不太可能再次访问时。Random Replacement (RR): 随机移除一个条目。这种策略实现简单但性能相对较差。First-In-First-Out (FIFO): 按照条目添加到缓存的顺序进行移除这种策略适用于一些特定场景例如缓存的数据具有固定生命周期。
cachetools中允许自定义缓存策略只需继承cachetools.Cache类并实现相应的方法。
from cachetools import Cacheclass SizeLimitedCache(Cache):def __init__(self, maxsize):super().__init__(maxsizemaxsize)def __getitem__(self, key, cache_getitemCache.__getitem__):return cache_getitem(self, key)def __setitem__(self, key, value, cache_setitemCache.__setitem__):if len(self) self.maxsize:self.popitem() # 删除一个缓存项cache_setitem(self, key, value)# 使用自定义缓存策略
custom_cache SizeLimitedCache(maxsize10)
for i in range(20):key key-{}.format(i)custom_cache[key] iprint(custom_cache.items())缓存操作
创建缓存时都需指定最大条目数lru cachetools.LRUCache(maxsize100)
maxsize参数代表的是缓存中可以存储的最大条目数量
缓存的添加、获取等类似dict操作
# 添加缓存项
lru[key] value# 获取缓存项
# value lru.get(key) # 不存在时返回None
value lru.get(key, default_value)# 删除缓存项
if key in lru:del lru[key]# 更新缓存项
lru[key] new_value其他有用函数与属性
clear()清空Cachepopitem()根据策略移除一项currsize获取当前缓存条目数量
TTLCache
TTLCache可设定过期时间过期后缓存条目自动失效
expire(self, timeNone)移除过期若time为None在使用当前时间条目get时不会更新过期时间只有重新设定数据cache[key]data才会更新过期时间已满时添加新条目会先移除过期条目然后尝试移除第一条。
def expensive_fun(arg1, arg2):key (arg1, arg2)# 如果缓存中已经有计算结果直接返回result cache.get(key)if result is not None:cache[key] result # extend expire-timereturn result, cached# 执行计算并将结果保存到缓存中time.sleep(1) # expensive calcresult arg1 arg2cache[key] resultreturn result, re-calc## cache test
cache TTLCache(maxsize5, ttl10)
for i in range(10):print(datetime.now(), expensive_fun(i, 2))print(cache.items())print(cache.items())for i in range(5):time.sleep(3)print(datetime.now(), expensive_fun(1, 2)) print(cache.items())# 等待缓存项已经过期
time.sleep(11)# 再次调用需要重新计算因为缓存项已经被清除了
print(datetime.now(), expensive_fun(1, 2))