1. 物理不过期(Physical Non-Expiration)
- 
定义 :在Redis中不设置
EXPIRE时间,缓存键永久存在(除非主动删除或内存淘汰)。 - 
目的:彻底规避因缓存自动过期导致的击穿(单热点失效)和雪崩(多键集中失效)。
 - 
数据示例 :
SET user:1001:profile "{\"name\":\"Alice\",\"last_update\":1690000000}" # 不设置TTL 
2. 逻辑过期(Logical Expiration)
- 
定义:在缓存值的元数据中嵌入过期时间戳,业务层自行判断数据新鲜度。
 - 
实现方式:
{ "data": "真实业务数据", "expire_time": 1690003600 // 逻辑过期时间戳 } - 
触发更新条件:
- 定时任务扫描:后台线程周期性检查逻辑过期时间,主动更新临近过期的数据。
 - 被动触发更新:当业务请求发现数据逻辑过期时,触发异步更新(需结合降级策略)。
 
 
3. 后台异步更新(Background Update)
- 
技术实现 :
- 独立线程池:与主业务线程隔离,避免更新操作阻塞正常请求。
 - 双缓冲机制:更新时生成新缓存副本,原子替换旧数据,避免脏读。
 
 - 
流程图 :
业务请求 → 读取缓存 → 判断逻辑过期 → 否 → 返回数据 ↓是 发起到消息队列 → 后台Worker消费 → 更新DB → 刷新缓存 
二、逻辑过期解决缓存击穿的实践
1. 缓存击穿(Cache Breakdown)
- 传统问题场景:热点Key突然失效,瞬时高并发请求穿透至数据库。
 - 本方案优势 :
- 无物理失效:热点Key永不自动删除,直接避免击穿触发条件。
 - 逻辑更新异步化 :即使业务认为数据过期,更新操作由后台线程异步处理,前端请求无需等待,降级返回稍旧数据或进入队列等待。