Redis 过期策略
Redis 主要是惰性策略和定时删除两种策略结合, 来清理过期 key.
惰性策略
客户端访问 Key 时, 先进行过期判断, 如果已经过期立即删除.
定时删除
- Redis 将设置了过期时间的 key 放在一个独立的字典中
- 没 10s 扫描一次此字典, 随机取 20 个 key
- 删除这 20 个 key 中的已经过期 key
- 如果已经过期的 key 占比超过 1/4, 则重复步骤 2-4
问题一: 某一个时刻大量 key 过期, 影响单线程的 redis 读写操作怎么办 ?
- 大量 key 过期一是堵塞线程,造成卡顿
- 二是大量内存回收导致 cpu 飙升
优化方案
- 每次定时扫描设置了 25ms 的上限, 当客户端请求正好遇到在扫描时, 至多等待 25ms, 当然如果客户端超时时间设置低于此阀值, 则会造成大量链接因为超时而关闭, 且还不会出现在 slowlog 中
- 业务开发人员在设置过期时间时, 建议加上一个随机值, 避免在同一时间过期
问题二: del 删除大 key 卡顿主线程怎么办 ?
- del 操作是立马释放内存, 小 key 的时候没没有明显延迟
- 如果一个包含了上千万的 hash key, 删除操作就会造成主线程明显卡顿
优化方案
- 使用上尽量避免大 key 的产生
- Redis 4.0 版本引入了
unlink
指令, 对删除操作懒处理, 交给异步线程执行 unlink
是线程安全的. Redis 中所有数据比作一颗大树,unlink
是指令是砍掉这个key所属的树枝, 丢到火堆(异步线程池)里慢慢烧, 在离开大树的瞬间, 就不会被主线程访问到.
- 上一篇: Redis 事务
- 下一篇: Redis 的优胜劣汰 LRU 算法