Redis数据淘汰机制

定时删除

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

优点 : 对内存友好,保证过期键会尽可能快地被删除,并释放过期键所占用的内存。

缺点 : 对CPU时间不友好,占用太多CPU时间,影响服务器的响应时间和吞吐量。

惰性删除

策略 : 放任过期键不管,每次从键空间读写操作时,都检查键是否过期,如果过期,删除该键,如果没有过期,返回该键。

优点 : 对CPU时间友好,读写操作键时才对键进行过期检查,删除过期键的操作只会在非做不可的情况下进行。

缺点 : 对内存不友好,只要键不删除,就不会释放内存,浪费太多内存,有内存泄漏风险。

定期删除

策略 :

对定时删除策略和惰性删除策略的一种整合和折中。每隔一段时间执行一次定时删除,并通过限制删除操作执行的总时长和总频率来限制删除操作对CPU占用时间的影响。通过定期删除过期键,有效减少了因为过期键而带来的内存浪费。

难点:确定删除操作执行的总时长和总频率。执行太频繁,执行时间过长,就会退化成定时删除策略,影响客户端请求效率;执行得太少,执行时间太短,会演变为惰性删除,存在内存浪费的情况。

Redis服务器使用惰性删除和定期删除两种策略,通过配合使用,很好地在合理使用CPU时间和避免浪费内存之间取得平衡。

举例:

从过期键中随机选取 20 个 key

遍历这 20 个 key,并对过期的 key进行删除操作

如果过期的 key 比率超过25%,则重复步骤 1

同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,增加了扫描时间的上限,默认不会超过 25ms以及频次上线10次。

主动清理

当前已用内存超过maxmemory限定时,触发主动清理策略。

清理时会根据用户配置的maxmemory-policy来做适当的清理。

主动清理策略主要有一下六种:

volatile-lru : 从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用 的数据淘汰。

volatile-ttl : 从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数 据淘汰。

volatile-random : 从已设置过期时间的数据集(server.db[i].expires)中任意选择数据 淘汰。

allkeys-lru : 从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰。

allkeys-random : 从数据集(server.db[i].dict)中任意选择数据淘汰。

no-enviction : 禁止驱逐数据。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 9.1 服务器中的数据库 Redis服务器将所有的数据库都保存在服务器状态redis.h/redisServer结...
    猪大金阅读 388评论 0 0
  • 主要内容 1.服务器保存数据库的方法 2.客户端切换数据库的方法 3.数据库保存键值对的方法 4.针对数据库保存增...
    Felicia1993阅读 342评论 0 0
  • 很有道理,有时候把所有事情丁丁卯卯的搞清楚不是好事情,有时候需要“知而变不知”
    弯月长虹阅读 950评论 0 0
  • 文/老春之子 冬天的风 像刀子一样锋利 削着我的脸 好疼好疼 冬天的风 像钢铁一样硬 砸到地上 地上就结起了冰 冬...
    老春之子阅读 310评论 0 2
  • 今天又是忙忙碌碌的一天,上午和辉丫头为了精益求精的小视频,简直是天下无敌了!今天我们又开始上课了,现在有个很好的发...
    32774430182c阅读 233评论 0 1