Redis系列02 - 数据的删除策略和淘汰策略

前言

Redis体系学习整理,点我点我
问题1:数据过期,怎么样才能最有效的删除过期数据??
问题2:内存满了,新数据进来,怎么处理?

数据删除

redis中setEx是我们用的最多的指令。我们享受着他自动过期的遍历。
但是过期(删除)数据,到底是怎么做的呢? 难道有计时器一直在后台跑嘛?还是说有其他更好策略。如果你也有这种疑惑,就来看看今天的文章吧。

先举个例子:和Redis类似,日常生活中,我们也会有扔垃圾的需求。这样我们就有几种常见的选择。
1:每天早上下楼时带上。(定期删除)
2:一直不扔,直到满出来了,再扔 (惰性删除)
3:随时随地,到点就扔(定时删除)
所有的程序,也是人设计出来的,源于生活,高于生活。
所以redis也使用了类似的策略。

过期删除 - 3种策略

定时删除

简而言之,到点立刻删除。
使用时间换空间的思想,节约内存,无过期占用,但是会消耗CPU资源。

惰性删除

下次访问的时候,如果过期了就删除。
这属于逻辑删除,节省CPU,消耗内存,如果没有跑到对应的逻辑,会存在泄漏的情况。

定期删除

设定一定的频率如:
server hz:10. (每秒运行10次)
Redis定时定评率,抽查内存情况,方式是【随机挑选样本检测】。如果单次删除的数据多。证明废弃数据占比高了,会再次检测和删除。
这种方式,每秒花费固定的CPU资源,进行内存维护。比较可控。

在日常企业开发中,选择呢惰性删除,配合定期删除,是个不错的选择~

逐出算法(淘汰机制)

说完expire的删除机制,顺道讲一讲相关的逐出算法。

触发场景

新增Key时进行判断,如果内存达到阈值(maxmemory中设置)并且开启了数据逐出。就会触发逐出。 (代码:新增时调用 freeMemoryIfNeeded())

8种策略

直接看配置,共有8种策略可供选择。
截图redis.conf文件在这里插入图片描述

给大家分分类。

  • 会过期的数据
    • volatile-lru :采用LRU策略,最久未使用的删除
    • volatile-lfu:采用LFU策略,最近最少使用的删除
    • volatile-ttl:过期时间最近的删除
    • volatile-random:随机挑选删除
  • 全DB的数据
    • allkeys-lru:采用LRU策略
    • allkeys-lfu:采用LFU策略
    • allkeys-random:随机挑选删除
  • 不逐出
    -noevication:可以看到配置中,redis4.0以上,这已经是默认策略了。未了安全。

具体Lru+Lfu不熟悉的小伙伴,可以自行了解。

具体的策略选择,大家可以 查看redis info 查看具体情况进行调优
一般关注 hits 命中次数和misses命中率。可以进行调优。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章