我是靠谱客的博主 高挑雪糕,最近开发中收集的这篇文章主要介绍Redis学习笔记-删除策略过期数据逐出算法/内存淘汰策略(主动删除?),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

过期数据

过期数据的删除策略:定时删除、定期删除、惰性删除

定时删除

在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。

优点:节约内存,到时就删除,快速释放掉不必要的内存占用

缺点: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学习笔记-删除策略过期数据逐出算法/内存淘汰策略(主动删除?)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部