如何实现一个简单带 LRU + TTL 的内存缓存
lru_cache不支持TTL,手动加时间判断会破坏原子性;ttlcache库专为LRU+TTL设计,自动过期检查;手写需耦合访问顺序、过期时间和访问时间;Redis缺精确LRU语义。
为什么不能直接用 lru_cache 加手动过期?
functools.lru_cache 本身不支持 TTL(Time-To-Live),它只按访问频次淘汰,无法自动清理“过期但未被驱逐”的条目。你可能试过在装饰函数里加时间判断,但这样会破坏缓存原子性:并发调用时可能重复计算、覆盖过期状态,且无法统一管理过期键。
用 ttlcache 库最省事
Python 生态里 ttlcache 是专为 LRU + TTL 设计的轻量库,内部用 OrderedDict 维护访问顺序,每个条目自带 expires_at 时间戳,get/set 时自动检查并清理过期项。
- 安装:
pip install ttlcache - 基础用法:
from ttlcache import TTLCache
cache = TTLCache(maxsize=128, ttl=60) # 60秒过期 cache['key'] = 'value' print(cache['key']) # 命中返回;超时后 KeyError
- 注意:
ttlcache的maxsize是硬上限,满时按 LRU 清理最久未用项,**不管是否已过期**;过期检查只在__getitem__或get时触发,不是后台定时扫描
自己实现要注意三个关键点
如果必须手写(比如嵌入无 pip 环境、或需定制淘汰逻辑),核心是把“访问时间”“过期时间”“访问顺序”三者耦合进一个结构,不能拆开维护。
阿里妈妈·创意中心
阿里妈妈营销创意中心
- 别用两个 dict 分别存数据和过期时间——容易不同步,尤其并发下
- 每次
get和set都要更新OrderedDict顺序,同时检查expires_at - 在
__setitem__中做容量检查时,先剔除所有过期项,再按 LRU 裁剪,否则可能保留一堆僵尸过期键占满空间 - 示例关键逻辑:
from collections import OrderedDict import time
class LRUTTLCache: def init(self, maxsize=128, ttl=60): self.maxsize = maxsize self.ttl = ttl self._data = OrderedDict()
def __setitem__(self, key, value): self._prune_expired() # 先清过期 self._data[key] = (value, time.time() + self.ttl) self._data.move_to_end(key) if len(self._data) > self.maxsize: self._data.popitem(last=False) def __getitem__(self, key): if key not in self._data: raise KeyError(key) value, expires_at = self._data[key] if time.time() > expires_at: del self._data[key] raise KeyError(key) self._data.move_to_end(key) # 更新 LRU 顺序 return value def _prune_expired(self): now = time.time() # 从头遍历,删除过期项(注意:不能边遍历边删 dict) to_delete = [k for k, (_, exp) in self._data.items() if exp zuojiankuohaophpcn= now] for k in to_delete: del self._data[k]
Redis 作为替代方案时的取舍
如果你已有 Redis,SET key value EX 60 天然支持 TTL,但缺原生 LRU 淘汰语义——它用的是近似 LRU(或 LFU,取决于配置),且淘汰发生在内存不足时,不是按访问频次主动管理。若业务强依赖精确 LRU 行为(比如热点 key 必须常驻),纯 Redis 不够可靠;这时更适合用本地 ttlcache + Redis 做二级缓存。
另外,redis-py 的 ConnectionPool 复用和序列化开销,在高频小数据场景下,可能比纯内存缓存慢一个数量级。
如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!
猜您喜欢
老内存杀疯了!DDR4反超DDR5成涨价王
2026-07-09据韩国价格追踪平台Danawa数据显示,采用三星芯片的16GBDDR4内存条在过去一个月内价格飙升约19%。 最低价从约162,000韩元(约合719元人民币)涨至193,130韩元(约合857元人民币)。同期16GBDDR5内存条涨幅仅约10%(约33,100韩元,合147元人民币)。 DDR4通常是价格波动相对较小的老款产品,涨势本应弱于DDR5。然而此次涨价幅度倒挂表明,内存短缺正以出人意料...
AI技术重大突破:内存涨价将遇狙击 内存用量大降
2026-07-03如今的内存涨价已经失控,一年来价格涨了5-10倍,主要推动力就来自AI数据中心需求,但这波涨价缺货很可能也会遇到狙击,技术突破也是来自AI优化。 大家都知道AI大模型对内存的容量及带宽都有极高的需求,所以高性能AI芯片大多上了HBM内存,其用量是DDR5内存的2-3倍,导致了这一次的内存缺货涨价。 内存缺货因AI而起,最终解决还得靠AI本身,想要减少内存用量就得优化内存架构,OpenAI分拆出来的...
MiMo Code:AI 自动编码如何辅助构建高并发缓存逻辑
2026-06-28MiMoCode是能理解项目上下文、拆解工程目标并协同执行多阶段任务的终端编码代理,擅长高并发缓存等系统级任务,具备上下文感知、Compose模式驱动、持久记忆、安全编辑与静态分析能力。 ☞☞☞AI智能聊天,问答助手,AI智能搜索,多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ MiMoCode不是简单补几行代码的助手,而是能理解项目上下文、拆解工程目标、协同执行多阶段任务的终端编码代理。构建高...
Agent 编排艺术:MiMo Code 如何实现复杂的开发任务拆解
2026-06-28MiMoCode通过Compose模式构建结构化任务图谱,由分工明确的子Agent协同执行,支持MaxMode多方案自评与DynamicWorkflow可编程编排,提升长程任务稳定性与一次性通过率。 ☞☞☞AI智能聊天,问答助手,AI智能搜索,多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ MiMoCode不靠单一大模型硬扛复杂任务,而是把开发过程当作可调度、可验证的工程流水线来处理。它用Age...
Win11内存标准再变!从32GB最佳、到8GB够用
2026-06-27在内存价格暴涨之下,之前还在宣称16GB内存是Copilot+PC不可妥协标准的微软,立场已经彻底反转。 微软近日更新了Surface购买指南,将8GB内存描述为“足以应对浏览、流媒体、学习和办公应用等日常使用”。 这种反转的速度令人咋舌,今年2月微软还称32GB是Windows11游戏玩家的理想配置,几个月后另一篇博客更进一步将32GB称为“无忧升级”方案,不过在遭到猛烈批评后微软悄悄删除了该文...
买Steam Machine像抽奖!内存随机配 V社称性能一样
2026-06-24Valve新款SteamMachine可能因元器件供应问题而出现不同内存配置,用户最终拿到的设备可能运行在单通道或双通道模式下,具体取决于Valve从供应商处获得的模组类型。 据DigitalFoundry报道,SteamMachine采用单个16GBDDR5-5600SO-DIMM内存模块。Valve解释称,由于8GBDDR5SO-DIMM模块难以采购到足够的生产数量,公司不得不改用单个16GB...
Win11内存占用率达到90%:别急着清内存 这是好事
2026-06-24从WinXP时代过来的玩家可能有个习惯,看到内存占用率高了之后就想法清理下内存,降低占用率,甚至很多人认为Win系统内存占用率越低越好。 大家不希望看到内存占用太高,主要原因就是担心内存用满之后系统会卡顿,这是多年前Win系统的顽疾了,所以清内存已经成为习惯性操作。 但在Win11上,这个思维模式可能要改改了,Windowscentral网站日前就刊文解析了这个问题,他们的观点就是大家不用看到内存...
价格崩不存在的!内存1年涨幅:去年7月买1600元现涨至7800
2026-06-18早前几乎没人能预判到DDR5内存会出现涨价行情,更不会想到本轮涨价的幅度会如此夸张。 德国零售市场的DDR5内存价格在2026年6月再度持续上扬,目前整体价格指数已经攀升到2025年7月同期水平的419%,普通用户装机和硬件升级的成本被进一步拉高。 受到全球生成式AI浪潮不断推高算力需求的直接影响,DDR5内存目前在全球多个主流市场的售价普遍维持在正常供需状态下4到5倍的高位区间,德国市场此前短暂...
大地视频app电视剧缓存方法
2026-06-09大地视频app如何下载电视剧,用户在本站下载安装好软件,点击手机桌面图标,打开大地视频,比如小编随机点击一部剧,点击下载,点击我们想要缓存的集数即可。 大地视频app电视剧缓存方法: 1.打开大地视频,比如小编随机点击一部剧。 2.点击下载。 3.点击我们想要缓存的集数即可。 以上就是小编整理带来的大地视频app如何下载电视剧,电视剧缓存方法,更多相关软件知识,请关注数字提纲手游栏目! 本文内容来...
酷狗大字版app歌曲缓存教程
2026-06-09酷狗大字版app怎么下载歌曲,在本站下载安装好的软件,在音乐界面找到并点击红色方框内的选项,在弹出的信息框中找到并点击“下载”选项,然后,继续选择下载类型之后就开始下载了。 酷狗大字版app歌曲缓存教程: 1、首先,打开在本站下载安装好的软件,在音乐界面找到并点击红色方框内的选项; 2、在弹出的信息框中找到并点击“下载”选项; 3、然后,继续选择下载类型之后就开始下载了。 以上就是小编整理带来的酷...
