"永不过期"策略实质是Redis key物理永存,逻辑过期时间嵌入value中;安全的get_with_logic_expire需用SETNX抢锁、双重检查、异步更新;必须搭配主动刷新机制防脏数据。什么是"永不过期"策略的实质它不是真的把 TTL 设成无穷大,而是让 Redis 的 key 永不物理过期(比如用 SET key value 不带 EX),但把逻辑过期时间藏在 value 里------比如存成 JSON:{"data": "xxx", "expire_at": 1741825620}。访问时只检查这个时间戳,不依赖 Redis 自动淘汰。怎么写一个安全的 get_with_logic_expire 函数关键不在"永不过期",而在"过期了怎么不卡住、不打垮 DB"。常见错误是:一发现逻辑过期就同步查库 + 写缓存,结果高并发下全挤在那条路线上。发现逻辑过期后,立刻尝试用 SETNX lock:xxx 1 EX 10 抢锁,失败则直接返回旧数据(哪怕已逻辑过期)抢到锁的线程,要再查一次缓存------因为可能别的线程刚更新完,避免重复查库查库成功后,用 SET key {"data":..., "expire_at": ...} 写回,不设 TTL;失败则删掉锁,别让锁残留异步更新推荐走轻量队列(如 Redis Stream 或线程池),不要在 HTTP 请求线程里 sleep 或阻塞等为什么不能真设成永久缓存业务数据会变,DB 更新了但缓存不动,就会一直返回脏数据。所以"永不过期"必须搭配主动刷新机制,否则就是掩耳盗铃。 唱鸭 音乐创作全流程的AI自动作曲工具,集 AI 辅助作词、AI 自动作曲、编曲、混音于一体
相关推荐
阿洛学长几秒前
PostgreSQL 超详细安装与使用教程:从入门到实战许彰午9 分钟前
Oracle Redo日志与Undo回滚段损坏恢复实战qxwlcsdn14 分钟前
mysql在事务中执行DDL的后果_MySQL 8.0之前的限制灰色人生qwer24 分钟前
Python 规则:带默认值的参数必须放在不带默认值的后面難釋懷24 分钟前
Redis通信协议-基于Socket自定义Redis的客户端环流_26 分钟前
redis:AOF2401_8844541538 分钟前
如何防止SQL触发器导致性能下降_通过精简触发器逻辑m0_5967490942 分钟前
Golang如何做Clean Architecture_Golang整洁架构教程【详解】czt_java1 小时前
线程安全问题半夜修仙1 小时前
Redis入门