redis过期策略&淘汰策略

Redis的过期策略

1、定时删除:
在设置键的过期时间的同时,创建一个定时器 timer. 让定时器在键的过期时间来临时,立即执行对键的删除操作。
2、惰性删除
放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期, 如果过期的话, 就删除该键;如果没有过期, 就返回该键。
3、定期删除
每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键, 以及要检查多少个数据库, 则由算法决定。(随机)
定期过期扫描的不是所有的key,而是带有过期时间的key。也不是一次性拿到所有的过期key,而是每次获取一定的数量(版本不同规则不同)淘汰。conf配置文件中的hz来进行配置。
Redis中同时使用了惰性过期和定期过期两种过期策略
假设Redis当前存放30万个key,并且都设置了过期时间,如果你每隔100ms就去检查这全部的key,CPU负载会特别高,最后可能会挂掉。
因此,redis采取的是定期过期,每隔100ms就随机抽取一定数量的key来检查和删除的。
但是呢,最后可能会有很多已经过期的key没被删除。这时候,redis采用惰性删除。在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间并且已经过期了,此时就会删除。
但是呀,如果定期删除漏掉了很多过期的key,然后也没走惰性删除。就会有很多过期key积在内存内存,直接会导致内存爆的。或者有些时候,业务量大起来了,redis的key被大量使用,内存直接不够了,运维小哥哥也忘记加大内存了。难道redis直接这样挂掉?不会的!Redis用8种内存淘汰策略保护自己~

Redis 内存淘汰策略(8种)

volatile-lru:当内存不足以容纳新写入数据时,从设置了过期时间的key中使用LRU(最近最少使用)算法进行淘汰;
allkeys-lru:当内存不足以容纳新写入数据时,从所有key中使用LRU(最近最少使用)算法进行淘汰。
volatile-lfu:4.0版本新增,当内存不足以容纳新写入数据时,在过期的key中,使用LFU算法进行删除key。
它在 LRU 算法上做了优化,增加了数据访问次数,从而确保淘汰的是非热点 key。
allkeys-lfu:4.0版本新增,当内存不足以容纳新写入数据时,从所有key中使用LFU算法进行淘汰;
volatile-random:当内存不足以容纳新写入数据时,从设置了过期时间的key中,随机淘汰数据;。
allkeys-random:当内存不足以容纳新写入数据时,从所有key中随机淘汰数据。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰;
noeviction:默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。
LFU根据最少次数来淘汰,会有一个时效性问题,就是有些数据可能不是热点数据,但是
由于之前的点击次数还在,那就导致旧数据淘汰不了,新的数据一直被淘汰,怎么解决
Redis对象内部会用一个24bit的字段来记录对象的访问时间跟次数,前面16bit代表的是最后访问时
间,后8bit代表的是次数,会根据前面的时间计算出这个对象多久没访问,如果很久没访问,会根据
配置来减少对应的次数。这样,越久时间不访问,次数减得越多。就能解决时效性问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

思静语

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

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

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

打赏作者

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

抵扣说明:

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

余额充值