Redis之key的淘汰策略

Redis中有一些Key到期了,需要一些策略来处理这些过期的key, 设置到期时间的key会放入一个单独的字典中,以后会定时遍历这个这个字典来删除到期的key,除了定时遍历以外,还会使用惰性策略来删除过期的key,当客户端访问这个的key时候会检查到期时间,到期了就立即删除。而定时删除是集中式处理。

一 Redis定时扫描策略

Redis是单线程,如果某一段时间过期的key很多,删除的时候会不会出现卡顿情况。Redis有一个定时扫描策略:

#1 Redis默认1秒扫描10次有到期时间的字典,即差不多100ms扫描一次

#2从过期字典中随机选择20个key进行扫描,将已经过期的key删除掉

#3 统计这一批20个key中的删除比例,如果有25%的key需要删除,则再进行一轮,即重复步骤2

#4 同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认扫描不会超过 25ms。

所以当客户端请求到来的时候,如果服务器正好在进行过期扫描,客户端的请求将会等待至少25毫秒才会处理,如果客户端连接设置的比较短有可能因为超时而关闭。所以如果有大批量的key需要过期,一定要设置随机到期时间,不适合在同一时间全部过期,分散处理过期范围。

二 从库的过期策略

2.1 从库不会主动删除过期的key

从库不会主动过期,既不会主动扫描过期。当主库的key到期的时候,会在AOF文件中增加一条del指令来删除过期的key。因为del指令是异步执行的,所以主库过期的key的del指令没有及时同步到从库的话,会出现从库数据不一致的情况。

2.2 主从数据同步,存在数据不一致的情况的解决方案

第一:如果业务允许段时间内主从不一致,则可以使用这样的方式

第二:如果确实不允许主从数据不一致,则该请求强行读主库

三 内存不足的时候key的淘汰策略

当Redis内存超过物理内存限制的时候,内存的数据开始和磁盘产生频繁的交换,这会使得Redis的性能急剧下降,生产环境一般是不允许这样的情况存在。为了限制最大使用内存,Redis提供了配置参数maxmemory来限制内存超出期望的大小。当实际使用内存超出maxmemory的时候,Redis提供了几种可以选择的策略,让用户自己来选择如何腾出新的空间以继续提供服务。

3.1 noeviction

不会继续服务写请求(del请求除外),读请求可以继续执行

3.2 volatile-lru

当内存不够的时候,对于最近很少使用的设置了过期时间的key进行淘汰

3.3 volatile-ttl

当内存不足的时候,对于设置了过期时间的key,剩余存活时间越短的key越先被淘汰

3.4 volatile-random

当内存不足的时候,从设置了到期时间的key中随机选择一部分key进行淘汰

3.5 allkeys-lru

当内存不足的时候,从所有的key中选择最近很少使用的进行淘汰

3.6 allkeys-random

当内存不足的时候,从所有的key中随机选择进行淘汰

我们知道key过期处理方式有2种: 集中删除和惰性删除。LRU淘汰不一样吗,只有惰性删除,当Redis执行写操作的时候,发现内存不够,超过了maxmemory,就会执行一次LRU淘汰算法,随机采样出5个(maxmemory_samples配置)个key,如果淘汰后内存还是超出maxmemory,则继续淘汰5个,直到低于maxmemory为止。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫言静好、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值