当前位置:   article > 正文

redis过期策略&淘汰策略_redis淘汰策略和过期策略

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代表的是次数,会根据前面的时间计算出这个对象多久没访问,如果很久没访问,会根据
配置来减少对应的次数。这样,越久时间不访问,次数减得越多。就能解决时效性问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/787334
推荐阅读
相关标签
  

闽ICP备14008679号