Redis的过期策略和内存淘汰机制
Redis过期策略
redis过期删除策略通常有三种:- 定时删除
在设置某个key的过期时间同时创建一个定时器,定时器负责监视key,过期则自动删除,虽然内存及时释放,但是十分消耗CPU资源。 - 定期删除
Redis默认每隔100ms就随机抽取部分设置了过期时间的key,检测这些key是否过期,如果过期了就将其删除。随机抽取部分,而不是全部,全部都去检测一遍的话CPU负载就会很高。难以确定删除操作执行的时长和频率,如果执行的太频繁,定期删除策略变得和定时删除策略一样,消耗CPU;如果执行的太少,那又和惰性删除一样。 - 惰性删除
当需要该key时,检查其是否过期,如果过期就删掉它,反之返回该key。
redis采用的是定期删除+惰性删除策略。这样还是存在一定问题,如果定期删除没删除key,然后也没即时去请求key,也就是说惰性删除也没生效,那么Redis的内存负载也会越来越高,那就应该采用内存淘汰机制了。
Redis内存淘汰机制
在配置文件redis.conf 中,可以通过参数maxmemory来设定最大内存,不设定该参数默认是无限制的。当内存不足时,就会采取内存淘汰机制,Redis内存淘汰方式有以下八种:- noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。(默认选项,一般不会选用)
- allkeys-lru:当内存不足以容纳新写入数据时,在整个键空间中,移除最近最少使用的key。(这个是最常用的)
- allkeys-lfu:当内存不足以容纳新写入数据时,在整个键空间中,移除最不经常(最少)使用的key。
- allkeys-random:当内存不足以容纳新写入数据时,在整个键空间中,随机移除某个key。
- volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
- volatile-lfu:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最不经常(最少)使用的key。
- volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
- volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
在配置文件redis.conf 中,可以通过参数maxmemory-policy来设置淘汰的方式。
总结
过期策略用于处理过期的缓存数据;内存淘汰策略用于处理内存不足时的需要申请额外空间的数据。所以内存淘汰策略的选取并不会影响过期的key的处理。参考:
https://blog.csdn.net/qq_33807380/article/details/124112600
https://blog.csdn.net/itcats_cn/article/details/82391719