在redis作为缓存使用的过程中,当内存不足时,redis根据配置进行缓存淘汰大部分keys,保证后续写入能够成功。
过期策略
redis中对过期的数据处理,有以下三种方式:
- 定时过期:
对每个设置过期时间的key都需要建一个定时器,到达设定的过期时间会立即清除。该方法对内存友好,对CPU不友好,会占用大量的CPU资源去处理过期数据 - 惰性过期
只有当访问一个key时,才会判断key是否过期,该方案最大化的节省CPU资源,但会占用内存资源(对CPU友好,对内存不友好) - 定期过期
每隔一定的时间,会扫描一定数据的expires字典中的一些数据,并清除其中已过期的数据
expires字典保存所有设置过期时间的数据
内存淘汰策略
在内存不足时(内存使用已经超过maxmemory参数设定值时),需要处理新写入的且需要申请格外空间的数据
- volatile-lru:从设置过期时间的数据集(expries)中挑选出最近最少使用的数据淘汰
- volatile-ttl:从设置过期时间的数据集(expries)中挑选将要过期的数据淘汰,ttl的值越大越优先被淘汰
- volatile-random:从设置过期时间的数据集(expries)中随机选取数据进行淘汰
- allkeys-lru:从数据集(dict)中挑选最近最少使用的数据淘汰,该策略淘汰的对象时全体key的集合,而非过期的key
- allkeys-random:从数据集(dict)中选择任意数据进行淘汰
- noeviction:禁止删除数据,当内存不足时,新写入操作就会报错,请求可以继续进行,保证已插入的数据不会丢失
主要策略:LRU淘汰,TTL淘汰,Random淘汰
- LRU策略(最近最少使用)核心思想:如果数据最近被访问过,那么将来被访问的机率也就会越高
- TTL策略:在redis中设置过期时间的数据集expries中挑选数据,根据ttl过期时间来进行淘汰,值越大越先淘汰
- 随机策略:在数据集中随机获取的数据进行删除
- LFU策略(最近最少使用):Redis4.0中新增策略,如果数据在最近一段时间很少被访问到,那么认为数据在将来被访问的可能性也比较小,因此,当空间满时,最小访问频率的数据会被最先淘汰(volatile-lfu;allkeys-lfu)
LRU与LFU不同:
LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面!
LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页面!