概述
过期数据
过期数据的删除策略:定时删除、定期删除、惰性删除
定时删除
在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
优点:节约内存,到时就删除,快速释放掉不必要的内存占用
缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量
用处理器性能换空间
定期删除(主动删除?)
redis默认每间隔100ms就随机抽取一些设置了过期时间的key检查其是否过期,如果过期就删除。周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度
CPU性能占用设置有峰值,检测频度可自定义设置
内存压力不是很大,长期占用内存的冷数据会被持续清理
惰性删除
定期删除可能会导致很多过期key到了时间并没有被删除调。所以就有了 惰性删除。如果过期的key定期删除没有删调,当再次使用get获取这个key的时候,redis会删除这个key,这就是所谓的惰性删除
优点:节约CPU性能,发现必须删除的时候才删除
缺点:内存压力很大,出现长期占用内存的数据
逐出算法/内存淘汰策略(主动删除?)
新数据进入时,如果内存不足的话,redis要临时删除一些数据为当前指令清理存储空间。
最大可使用内存maxmemory:占用物理内存的比例,默认值为0,表示不限制。通常设置在50%以上
每次选取待删除数据的个数maxmemory-samples: 选取数据时并不会全库扫描,导致严重的性能损耗,降低读写性能。因此采用随机获取数据的方式作为待检测删除数据
删除策略:maxmemory-policy 达到最大内存后,对被选出来的数据进行删除的策略
在redis.conf文件中可以配置主动删除策略,默认是no-enviction(不删除)
maxmemory-policy allkeys-lru
LRU
LRU (Least recently used) 最近最少使用,算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:
- 新数据插入到链表头部
- 每当命中缓存(即缓存数据被访问),则数据移动到链表头部
- 当链表满的时候,将链表尾部数据丢弃
Redis的LRU 数据淘汰机制
在服务器配置中保存了 lru 计数器 server.lrulock,会定时(redis 定时程序 serverCorn())更新,server.lrulock 的值是根据 server.unixtime 计算出来的。
另外,从 struct redisObject 中可以发现,每一个 redis 对象都会设置相应的 lru。可以想象的是,每一次访问数据的时候,会更新 redisObject.lru。
LRU 数据淘汰机制是这样的:在数据集中随机挑选几个键值对,取出其中 lru 最大的键值对淘汰。
- volatile-lru
从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 - allkeys-lru
从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
LFU
LFU (Least frequently used) 最不经常使用,如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小。
Redis中的LFU
- volatile-lfu
- allkeys-lfu
random
随机
- volatile-random
从已设置过期时间的数据集中任意选择数据淘汰(跟定期删除一样的?
) - allkeys-random
从数据集中任意选择数据淘汰
ttl
- volatile-ttl
从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
redis 数据集数据结构中保存了键值对过期时间的表,即 redisDb.expires。
TTL 数据淘汰机制:从过期时间的表中随机挑选几个键值对,取出其中 ttl 最小的键值对淘汰。
noenviction
禁止驱逐数据,不删除 默认
缓存淘汰策略的选择
- allkeys-lru : 在不确定时一般采用策略。 冷热数据交换
- volatile-lru : 比allkeys-lru性能差 存 : 过期时间
- allkeys-random : 希望请求符合平均分布(每个元素以相同的概率被访问)
- 自己控制:volatile-ttl 缓存穿透
最后
以上就是高挑雪糕为你收集整理的Redis学习笔记-删除策略过期数据逐出算法/内存淘汰策略(主动删除?)的全部内容,希望文章能够帮你解决Redis学习笔记-删除策略过期数据逐出算法/内存淘汰策略(主动删除?)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复