Redis 过期策略

Redis 主要是惰性策略和定时删除两种策略结合, 来清理过期 key.

此处输入图片的描述

惰性策略

客户端访问 Key 时, 先进行过期判断, 如果已经过期立即删除.

定时删除

  1. Redis 将设置了过期时间的 key 放在一个独立的字典中
  2. 没 10s 扫描一次此字典, 随机取 20 个 key
  3. 删除这 20 个 key 中的已经过期 key
  4. 如果已经过期的 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