Welcome everyone

redis的过期策略和内存淘汰策略

redis 汪明鑫 347浏览 4评论

过期策略

set时给key指定一个过期时间ttl

过期时间到了就会立即删除存储的key value以及对应的内存嘛

当然不是,redis的过期策略涉及到惰性删除和定期删除

 

定期删除

由于redis中的key不是过期就会马上触发删除,引入了一些机制,如定期删除

redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除
既然时随机,肯定就会遗漏很多key没有清除,清除的不干净,内存也还被一些过期的key占用
因此还需要惰性删除去走查key触发删除
为什么redis需要随机抽查,而不是类似JVM GC 那样扫描遍历做标记做清除呢?
试想下,keys * 本身就是一个redis的慢查询命令,在生产环境数万甚至更多key,用了可能直接原地爆炸
同理,你怎么指望redis去扫描所有的key,删除过期时间到的呢?不一样会有把redis服务拖垮的风险

惰性删除

惰性删除可以类比惰性加载

惰性加载当对象被使用时才加载初始化

惰性删除 当key过期时间到了,去get 查一下,如果过期了,这时候才会触发删除,返回空

 

因此redis的过期策略 依赖  redis的「定期删除和惰性删除」

 

内存淘汰策略

大量key堆积,且有些没有指定过期时间,或者指定的过期时间还没有经过定期删除/惰性删除

如果key继续堆积,很可能导致内存撑爆

这时候就需要redis内存淘汰策略了!

假如没看过redis内存淘汰策略,面试官又恰好问到你,

凭借对操作系统缓存淘汰机制的回忆大概率可以猜测答上一句lru算法,就可以加分

 

 

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

 

一般最常用的就是   allkeys-lru

 

 

 

转载请注明:汪明鑫的个人博客 » redis的过期策略和内存淘汰策略

喜欢 (0)

说点什么

4 评论 在 "redis的过期策略和内存淘汰策略"

提醒
avatar
排序:   最新 | 最旧 | 得票最多
曹绍军
成员

优秀的鑫爷

san.zhang
游客

优秀的牛逼鑫。
定时、惰性、定期,redis采用 惰性+定期,hhh

wpDiscuz