Python怎样手动编写一个自己的LRU缓存装饰器
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,Python怎样手动编写一个自己的LRU缓存装饰器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。LRU缓存算法,指的是近期最少使用算法,
千家信息网最后更新 2026年11月01日Python怎样手动编写一个自己的LRU缓存装饰器
Python怎样手动编写一个自己的LRU缓存装饰器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
LRU缓存算法,指的是近期最少使用算法,大体逻辑就是淘汰最长时间没有用的那个缓存,这里我们使用有序字典,来实现自己的LRU缓存算法,并将其包装成一个装饰器。
1、首先创建一个my_cache.py文件 编写自己我们自己的LRU缓存算法,代码如下:
import timefrom collections import OrderedDict '''基于LRU,近期最少用缓存算法写的装饰器。''' class LRUCacheDict: def __init__(self, max_size=1024, expiration=60): self.max_size = max_size self.expiration = expiration self._cache = {} self._access_records = OrderedDict() # 记录访问时间 self._expire_records = OrderedDict() # 记录失效时间 def __setitem__(self, key, value): # 设置缓存 now = int(time.time()) self.__delete__(key) # 删除原有使用该Key的所有缓存 self._cache[key] = value self._access_records = now # 设置访问时间 self._expire_records = now + self.expiration # 设置过期时间 self.cleanup() def __getitem__(self, key): # 更新缓存 now = int(time.time()) del self._access_records[key] # 删除原有的访问时按 self._access_records[key] = now self.cleanup() def __contains__(self, key): # 这个是字典默认调用key的方法 self.cleanup() return key in self._cache def __delete__(self, key): if key in self._cache: del self._cache[key] # 删除缓存 del self._access_records[key] # 删除访问时间 del self._expire_records[key] # 删除过期时间 def cleanup(self): # 用于去掉无效(超过大小)和过期的缓存 if self._expire_records is None: return None pending_delete_keys = [] now = int(time.time()) for k, v in self._expire_records.items(): # 判断缓存是否失效 if v < now: pending_delete_keys.append(k) for del_k in pending_delete_keys: self.__delete__(del_k) while len(self._cache) > self.max_size: # 判断缓存是否超过长度 for k in self._access_records.keys(): # LRU 是在这里实现的,如果缓存用的最少,那么它存入在有序字典中的位置也就最前 self.__delete__(k) break代码逻辑其实很简单,上面的注释已经很详细了,不懂的话多看几次。这里实现LRU逻辑的其实是有序字典OrderedDict,你最先存入的值就会存在字典的最前面。当一个值使用时候,我们会重新储存过期时间,导致被经常使用的缓存,会存在字典的后面。而一但缓存的内容长度超过限制时候,这里会调用有序字典最前面的key(也即是近期相对用的最少的),并删除对应的内容,以达到LRU的逻辑。
2、在将我们写好的算法改成装饰器:
from functools import wrapsfrom my_cache import LRUCacheDict def lru_cache(max_size=1024, expiration=60, types='LRU'): if types == 'lru' or types == 'LRU': my_cache = LRUCacheDict(max_size=max_size, expiration=expiration) def wrapper(func): @wraps(func) def inner(*args, **kwargs): key = repr(*args, **kwargs) try: result = my_cache[key] except KeyError: result = func(*args, **kwargs) my_cache[key] = result return result return inner return wrapper
这里需要解释的是直接使用 my_cache[key],这个类似字典的方法,实际上是调用了 LRUCacheDict 中的 __contations__方法,这也是字典中实现通过key取值的方法。这个装饰器里,我加入了types的参数,你们可以根据需求,实现不同的缓存算法,丰富这个装饰器的功能,而lru缓存本身,其实已经是python的标准库了,可以引入functools.lru_cache来调用。
看完上述内容,你们掌握Python怎样手动编写一个自己的LRU缓存装饰器的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
缓存
字典
时间
算法
方法
有序
内容
逻辑
手动
代码
时候
更多
长度
问题
不同
最长
束手无策
为此
位置
功能
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技垄断
科技与互联网发展
北京互联网络科技有限公司
互联网科技视频素材
重庆科技学院互联网
恒银科技与互联网金融
互联网系的金融科技公司
互联网对科技的发展
崇明区互联网教育科技售后服务
宜昌元轩互联网科技有限公司
互联网公司黑科技创始人
深圳艾果互联网通讯科技
互联网科技公司营业执照怎么办理
富国互联网科技002692
东营紫格互联网科技
信承诺互联网科技有限公司
世界互联网科技成果奖
万物互联网智能科技
第三届互联网大会安防黑科技
科技发展第三阶段互联网时代
科技和互联网公司
互联网 科技
互联网科技咨询
人人互联网科技是培训
顺网科技2021年互联网排名
海南购全球互联网科技
洛阳昕诺飞互联网科技有限公司
银川新华互联网科技学校联系电话
沐思想互联网科技有限公司
互联网科技自媒体灵感