redis内存淘汰和过期策略及淘汰算法思路

redis 的内存空间(maxmemory 参数配置)已经用满时,

8种淘汰策略

默认策略:

noeviction:不淘汰key,如果内存已满,添加数据是报错。

allkeys类(所有数据):

allkeys-lru:在所有的 key 中,使用 LRU 算法淘汰空转时间最长的key

allkeys-lfu:在所有的 key 中,使用 LFU 算法淘汰某段时间之内使用频次最少的key

allkeys-random:在所有的 key 中,随机淘汰key

volatile类(已设置过期时间的数据)

volatile-lru:在设置了过期时间的 key 中,使用 LRU 算法淘汰空转时间最长的 key

volatile-lfu:在设置了过期时间的 key 中,使用 LFU 算法淘汰某段时间之内使用频次最少的 key

volatile-random:在设置了过期时间的 key 中,随机淘汰key

volatile-ttl:在设置了过期时间的 key 中,优先删除TTL(time to live,剩余时间)短的 key 淘汰

3种过期策略

定时过期在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作对内存最友好,对 CPU 时间最不友好。

惰性过期:放任键过期不管,但是每次获取键时,都检査键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。对内存最不友好,对 CPU 时间最友好。

定期过期:每隔一段时间,默认100ms,程序就对数据库进行一次检査,删除里面的过期键。至于要删除多少过期键,以及要检査多少个数据库,则由算法决定。前两种策略的折中,对 CPU 时间和内存的友好程度较平衡

淘汰算法:本质使用双向链表来实现,但光有这还不够,还需要使用Map来将key映射到对应的节点

LFU算法(Least Frequently Used 的缩写,即频率最少使用:

对于链表里的每个key维护一个计数器。每次key被访问的时候,计数器增大。计数器越大,可以约等于访问越频繁, 记录key最后一个被访问的时间,淘汰数据时淘汰计数器最小的,如果计数器相同,则淘汰时间最早的。

LRU算法(Least Recently Used 的缩写,即最近最少使用:

最简单的实现方式就是把所有缓存通过一个链表连接起来,新创建的缓存添加到链表的头部,如果有缓存被访问了,就把缓存移动到链表的头部。由于被访问的缓存会移动到链表的头部,所以没有被访问的缓存会随着时间的推移移动的链表的尾部,淘汰数据时只需要从链表的尾部开始即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值