一、过期键删除策略
-
定时删除: 在设置键的过期时间的同时,创建一个定时器(timer),过期时间一到就立即执行对键的删除操作
优点:对内存是最友好的,保证尽快删除过期键,并释放过期键所占用的内存
缺点: 对CPU是最不友好的,在过期键比较多的情况下,删除过期键会占用cpu的较多时间,会对服务器的响应时间和吞吐量造成影响 -
惰性删除: 在获取键的时候对键进行过期检查,如果键过期的话就进行删除
优点:对CPU是最友好的,保证对过期键的删除操作只会在非做不可的情况下进行,并且删除目标仅限于当前键
缺点:对内存是最不友好的,大量不经常被访问的过期键会一直存储在内存中,占用内存空间,浪费内存 -
定期删除: 定期删除过期键,通过限制删除操作的执行时长和频率来减少删除操作对CPU的影响,TA是对定时删除策略和惰性删除策略的整合和折中
难点:确定删除操作执行的时长和频率,如果删除太频繁或执行时间过长,就会退化称定时删除策略;如果删除操作执行的太少或者执行时间太短,又会退化为惰性删除策略,出现内存占用的情况
二、Redis过期键删除策略
Redis采用惰性删除和定期删除相结合的策略!
- 在执行所有对数据的读写命令以前做如下判断:
- 周期性地执行定时删除函数:
三、Redis内存淘汰策略
当Redis使用的内存超过允许的最大内存之后,会触发Redis的内存淘汰策略,删除一些不常用的数据,以保证Redis服务器正常运行。内存淘汰策略可以通过配置文件来修改,相应的配置项是maxmemory-policy,默认配置是noeviction。
Redis 4.0前提供 6 种数据淘汰策略:
- volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的key中,移除最近最少使用的key
- allkeys-lru:当内存不足以容纳新写入数据时,移除最近最少使用的key,这个是最常用的
- volatile-ttl :当内存不足以容纳新写入数据时,在设置了过期时间的key中,优先移除过期时间最早(剩余存活时间最短)的key
- volatile-random:内存不足以容纳新写入数据时,在设置了过期时间的key中,随机移除某个key
- allkeys-random:当内存不足以容纳新写入的数据时,随机移除key
- no-eviction:当内存不足以容纳新写入数据时,新写入操作会报错,无法写入新数据,一般不采用
Redis 4.0后增加以下两种:
- volatile-lfu:当内存不足以容纳新写入数据时,在设置了过期时间的key中,移除最不经常(最少)使用的key
- allkeys-lfu:当内存不足以容纳新写入数据时,移除最不经常(最少)使用的key