← [ BACK_TO_NOTES ]

Redis Expiration 与 Eviction

区分 Redis 的 TTL 逻辑过期与内存压力淘汰,解释逻辑失效、物理清理、maxmemory-policy 和不同状态丢失语义。

#concept #growing #backend #redis

[!info] related notes

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。
创建于 2026/9/18 更新于 2026/9/18
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本