python自带的lru_cache用起来很方便,对于需要大量计算来说,能大大减少计算时间;对于从后端或DB等提取数据来说,能大大减轻后端的压力,加速效果很明显。
但是实际应用的时候,如果后端某个数据更新了,lru_cache没提供删除单个数据方法,只能用cache_clear清空所有缓存数据,效率不高。
1、如果允许短时间内使用脏数据的话,可以设置一个过期时间,防止后台数据修改了而缓存一直不会更新;
Python资源共享群:484031800
2、如果不允许缓存读到脏数据,需要一个删除脏数据的接口,下次调用时刷新数据。
下面代码实现了一个带过期时间的缓存字典类和一个带过期时间的缓存装饰器,能同时解决上面两种情况,支持先进先出和LRU两种缓存淘汰算法。
注:暂不不支持多线程和异步协程库
用法:字典DictWithTTL和装饰器fifocachewithttl的参数相同
capacity: int = 128 最大缓存数量
ttl: int = 300 缓存时间(秒)
lru: bool = True 淘汰算法类型 True时为lru,False为FIFO
提供几个函数:
cache_info 查看缓存统计信息
cache_clear 清空缓存数据
cache_remove 移除缓存值
用例:
@fifocachewithttl(capacity=100, ttl=300)def addone(n): return n+1
所有代码如下,如有错误,欢迎指正。
from collections import OrderedDictfrom functools import partialfrom