redis的过期、内存淘汰策略以及所使用的算法

本文详细介绍了Redis的过期策略,包括定期删除和惰性删除,并探讨了内存淘汰机制,如LRU和LFU策略。Redis在面对大量过期Key时如何处理,以及如何配置内存淘汰策略以适应不同场景。
摘要由CSDN通过智能技术生成

一、redis过期策略

  当我们通过set命令保存某些数据的时候,可以指定过期时间,使缓存到时间后失效。但当redis中的key数量随着时间推移逐渐增长,我们常常发现某批量的key到时间应当过期删除了,但实际发现内存并没有得到释放,这就涉及到redis过期策略问题,redis的过期策略有两种:定期删除以及惰性删除。

1、定期删除

  (1)redis每隔100ms就会随机抽取一些设置了过期时间的key检测是否过期,如果过期了就删除掉。也就是说redis并不是每次都检查所有的有过期时间的key,那样会引发很大的性能问题,可能大部分的时间可能都会花在遍历过期key上。
  (2)由于并不是实时删除所有过期key,这就会导致存在明明某批量的key已经过了到期时间,但发现内存并没有得到释放的问题。

2、惰性删除

  由于定期删除都是随机抽取有过期时间的key检查,就会存在很多过期了但并没有得到删除的key,所以引入了惰性删除的方式,也就是在查询某个key的时候再检查一下key是否已过期,如果已经过期,就删除掉,没有过期才返回给客户端。

二、内存淘汰机制

  如果定期删除依然存在大量过期key且没有查询操作引发删除,内存的占用就会越来越高,当占用到一定程度后,就会通过redis的内存淘汰机制去删除掉。

1、内存淘汰策略

  (1)内存淘汰机制有以下六种策略(可通过redis.conf进行配置):

# volatile-lru -> 使用类似LRU算法从设置了过期时间的key集合中移除一个key,用的较少
# allkeys-lru -> 使用类似LRU算法移除任意的key,比较常用
# volatile-lfu -> 使用类似LFU算法从设置了过期时间的key集合中移除一个key,用的较少
# allkeys-lfu -> 使用类似LFU算法移除任意的key,比较常用
# volatile-random -> 从设置了过期时间的key集合中随机删除某个key,很少用
# allkeys-random -> 随机删除某个key,很少用
# volatile-ttl -> 从设置了过期时间的key集合中删除最早过期的key,很少用
# noeviction -> 不移出任何key,直接报一个error给客户端,很少用

  (2)默认情况的内存淘汰机制是noeviction,可通过以下配置调整

maxmemory-policy noeviction

2、redis的LRU/LFU

   LRU:最近最少被使用( Least Recently Used)
   LFU:最少被使用(Least Frequently Used)

   redis的LRU/LFU都是采用近似随机算法进行实现,也就是随机获取一定量的key,然后移除掉最近最少被使用的key,可以通过以下配置采样数调整速度和精度,每次获取10个key比较接近真正的LRU,但需要花费更多的cpu,3的速度比较快,但不是很准确

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值