Redis如何通过永不过期策略规避击穿

"永不过期"策略实质是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 自动作曲、编曲、混音于一体

相关推荐
Fanta丶5 小时前
10.Python class类的定义和魔术方法
python
花生了什么事o6 小时前
JVM 垃圾回收:对象如何被判定和回收
java·jvm
闲猫6 小时前
LangChain / Integrations / Integrations by component / Tool
java·数据库·langchain
xqqxqxxq6 小时前
SQL 连接查询技术笔记
数据库·笔记·sql
小玮看世界6 小时前
[Python]从“脏”数据到优雅实现:一个IoT滑动窗口最大值问题的测试驱动优化实录
linux·前端·python
Databend7 小时前
从万亿级大模型到全线应用:Databend Cloud 助力头部 AI 企业构建全链路 Trace 数据管道
大数据·数据库·sql
MC皮蛋侠客7 小时前
SQLAlchemy 系列(十一):从 1.x 到 2.x——渐进迁移与数据访问层治理
数据库·python
魔镜前的帅比7 小时前
(开源项目)x-claw (设计)
python·ai·rust·开源
1001101_QIA7 小时前
工控机网络配置
开发语言·数据库·php