redis删除过期key的算法_Redis过期key删除策略

Redis过期策略包括定时任务删除和惰性删除。

在Sentinel模式下,从库不会进行过期扫描,主库key过期后,会在AOF文件里面新增一条del指令,当AOF文件同步到所有从库时,从库才执行这条del语句来删除过期的key。AOF同步是异步进行的,所以可能会出现数据不一致的情况。

584d983d2610216bd6dfa8fe7ff76d7f.png

Redis内存淘汰策略

Redis之所以吞吐率高,很大一个原因就是在内存中进行的操作,当Redis超出物理内存限制时,Redis就会频繁的在内存和磁盘中交换数据,交换数据会让Redis的性能极速下降。所以,为了限制使用的最大内存,Redis提供了maxmemory参数来限制内存大小。当内存超出maxmemory时,Redis提供了几种策略来释放新的内存,以便Redis能继续对外提供读写服务

e74da8e610a1b21c777d33eabe548e78.png

从图片可以看出,allkeys-开头的策略是针对多有的key

LRU算法

普通LRU算法很简单,就是一个链表就可以解决,每次访问一个值,就把这个值移到链表的头部,需要淘汰的时候,就移除链表最后一个值就可以了。

Redis的近似LRU算法

Redis实现LRU算法,除了维护key/value外,还需要单独维护一个链表,或者每个key再存储两个指针。

根据Redis作者的说法,每个Redis Object可以挤出24 bits的空间,但24 bits是不够存储两个指针的,而存储一个低位时间戳是足够的这是一个非常占用内存的方式。所以Redis采用的是方法是在每个key增加了一个长度为24bit的字段,来存储这个key最近一次的访问时间戳。

文章最开始提到的过期key淘汰策略有定时任务和惰性删除。这里,LRU淘汰只采用了惰性处理,当Redis执行写操作,发现Redis内存超出maxmemory时,就会执行一次LRU淘汰算法。算法步骤时每次随机选择5个key,然后淘汰最旧的那个key,重复此步骤,知道内存低于maxmemory为止。

从Redis 3.0之后有改善了这个算法的性能。3.0之后不再是从所有的key池里面随机抽选5个key,而是会提供一个待淘汰、大小为16的key pool,pool里面的key是按空闲时间排好序了,每次都是淘汰空闲时间最久的那个key

87c6c85cbf7dca539808c24e9be57176.png

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值