关于Redis过期和淘汰策略

287 阅读2分钟

过期策略

集中处理

过期的 key 集合

所有设置了过期时间的key都会放入一个独立的字典中,后期定时扫描该字典,删除过期的key

扫描策略

  1. 从过期字典中随机 20 个 key
  2. 删除这 20 个 key 中已经过期的 key
  3. 如果过期的 key 比率超过 1/4,那就重复步骤 1

同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms

如果同一时间大量的key过期,会导致redis持续的扫描过期key字典,会导致用户的请求出现卡顿,因为系统需要频繁的回收内存页

所以最好给过期时间增加一个随机数,分散一下压力

零散处理

在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除

淘汰策略

当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap)。交换会让 Redis 的性能急剧下降

为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制内存超出期望大小

当实际内存超出 maxmemory 时,Redis 提供了几种可选策略 (maxmemory-policy) 来让用户自己决定该如何腾出新的空间以继续提供读写服务

noeviction:拒绝写请求

volatile-lru:淘汰最少使用的key(设置过期时间的key集合)

volatile-ttl :淘汰剩余ttl最少的key(设置过期时间的key集合)

volatile-random:随机淘汰key(设置过期时间的key集合)

allkeys-lru:淘汰最少使用的key(所有key集合)

allkeys-random:随机淘汰key(所有key集合)

过期与淘汰的区别

过期机制是定时执行的,淘汰机制则是当使用内存达到上限时才会触发

参考

Redis 深度历险:核心原理与应用实践