过期策略
集中处理
过期的 key 集合
所有设置了过期时间的key都会放入一个独立的字典中,后期定时扫描该字典,删除过期的key
扫描策略
- 从过期字典中随机 20 个 key
- 删除这 20 个 key 中已经过期的 key
- 如果过期的 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集合)
过期与淘汰的区别
过期机制是定时执行的,淘汰机制则是当使用内存达到上限时才会触发