Redis面试之过期策略及内存淘汰机制

Redis过期策略主要有两个:
定期删除+惰性删除

1、定期删除
Redis 将每个设置了过期时间的 key 放到独立的字典中,默认每 100ms 扫描一次,大致流程为:

  • 随机选择 20 个 key
  • 删除 20 个 key 中过期的 key
  • 判断过期的 key 比例,如果超过总过期 key 数量的 1/4,再从步骤 1开始执行继续删除知道满足条件

那么问题来了,定期删除策略中为什么只随机扫描一些 key 而不是扫描所有的 key?

Redis 是单线程啊,设想一下,如果 key 都有过期时间,全部扫一遍会卡死的。而且为了防止每次扫描的时候,过期 key 的比例都超过了 1/4,从而导致一直循环把线程卡死,Redis 还给每次扫描设置了上限时间,默认 25ms。

你可能又会问了,既然是随机选择过期key,万一始终没随机到很多key,内存里面不就存在大量的无效key了么?

这时就需要另一种策略出马了,惰性删除

2、惰性删除
惰性嘛,字面意思就是懒,这时候 Redis 不去主动删除过期的 key-value,而是等客户端来读的时候再做判断,如果已经过期了,就把它删了然后返回空,没过期该怎么样怎么样。

那么问题来了,如果定期没删同时也没被查询的那些过期key怎么办,一直积累下去岂不是会发生内存泄漏?

此时就会用到 Redis 内存淘汰机制了,我们需要在 redis.conf 中的配置参数 maxmemory 去限制 Redis 可供使用的内存上限。当超出这个阈值时,Redis 会触发相应的内存淘汰机制,主要有以下 6 种:

在这里插入图片描述

上面的几种机制可通过 config set maxmemory-policy {policy} 语句配置。
 
 

 
 
 
 
 
 
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值