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 种:

Redis面试之过期策略及内存淘汰机制_第1张图片

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

 
 
 
 
 
 
Redis面试之过期策略及内存淘汰机制_第2张图片

你可能感兴趣的:(Redis,redis,面试,内存淘汰,过期策略)