Redis Expiration 与 Eviction
区分 Redis 的 TTL 逻辑过期与内存压力淘汰,解释逻辑失效、物理清理、maxmemory-policy 和不同状态丢失语义。
#concept
#growing
#backend
#redis
[!info] related notes
- 所属 MOC:BodySense Redis 从零到一课程 MOC、Backend 常用中间件与基础设施 MOC
- 前置概念:Redis
- 关系笔记:缓存策略与一致性
- 对应课程:BodySense Redis 第 3 课
Redis Expiration 与 Eviction
一句话定义
Expiration 是 Key 到达应用定义的 TTL 后正常失效;Eviction 是 Redis 在内存压力下依据 maxmemory policy 提前移除 Key。两者都会让 Key 消失,但业务语义不同。
核心模型
Expiration
→ time reached
→ "应该失效"
Eviction
→ memory pressure
→ "不得不提前移除"
TTL 表达生命周期,不表达内存保障。
逻辑过期与物理清理
Key TTL 到期后,对应用已经等价于不存在。Redis 可以通过:
- lazy expiration:访问时发现已过期并清理;
- active expiration:后台主动发现并清理;
回收底层内存。
因此:
过期时刻决定逻辑有效性,不要求底层对象在同一纳秒完成物理释放。
maxmemory-policy 的语义
- noeviction:内存达到限制后保留已有 Key,让新写入失败;
- allkeys-*:所有 Key 都可能成为淘汰候选;
- volatile-*:只从设置了 TTL 的 Key 中选择候选。
[!warning] volatile-* 不是“只删除已经过期的 Key”。尚有剩余 TTL 的 Key 也可能被提前淘汰。
为什么 Cache 与 Runtime Authority 的 Eviction 风险不同
Cache key evicted
→ authoritative source remains
→ rebuild
Session key evicted
→ authority itself lost
→ user may be logged out early
Rate-limit key evicted
→ protection window may reset
因此不同丢失语义的数据不应未经分析地共享同一 eviction domain。
观测
expired_keys
→ 正常 TTL 生命周期信号
evicted_keys
→ 内存压力 / 淘汰信号
如果实例承载安全关键 Session / Refresh authority,evicted_keys 增长需要高优先级处理。
BodySense 不变量
session:<sid>
= auth authority
Session TTL 到期属于正常 expiration;Session 未到期却因 eviction 消失会改变用户在线状态。
当前长期方向应明确 Redis 自身 maxmemory 与 policy,安全关键实例优先避免静默淘汰认证状态。
边界与易混淆点
- TTL ≠ persistence;
- TTL ≠ eviction;
- 有 TTL ≠ 保证活到 TTL;
- logical expiration ≠ 精确物理 GC;
- noeviction 也不代表系统不会失败,它会把压力显式转换成 write error。