Redis内存淘汰策略

内存淘汰:就是当redis内存达到设置的阈值时,主动挑选部分key删除以释放内存

可以分为两个问题:

1,redis什么时候去检查内存够还是不够?

2,怎么来决定删除哪些key?(淘汰策略)

 

1,如果配置了内存上限,redis在任何命令执行之前都会进行内存的检查,如果内存不够的话执行淘汰策略

复制代码
int processCommand(client *C) {
    //如果服务器设置了server . maxmemory属性,并且并未有执行lua脚本
    if (server .maxmemory && ! server . Aua_ timedout) {
        //尝试进行内存淘汰per formEvictions
        int out_of_memory = (performEvictions() == EVICT_ FAIL) ;
            if (out_ of_ memory && reject_ cmd_on_ oom) {
                rejectCommand(C,shared. oomerr) ;
                return C_ _OK;
    }
    // ....
  }
}                
复制代码

2,redis的八种内存淘汰策略

noeviction:不淘汰任何key, 但是内存满时不允许写入新数据,默认就是这种策略。

◆volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰
◆allkeys-random:对全体key,随机进行淘汰。也就是直接从db->dict中随机挑选
◆volatile-random: 对设置了TTL的key,随机进行淘汰。也就是从db->expires中随机挑选。
◆allkeys-lru:对全体key, 基于LRU算法进行淘汰
◆volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰
◆allkeys-lfu: 对全体key, 基于LFU算法进行淘汰
◆volatile-lfu: 对设置了TTL的key,基于LFI算法进行淘汰
比较容易混淆的有两个:

LRU (Least Recent Use) : 最少最近使用,用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

LFU (Least Frequent Use) :最少频率使用,会统计key的访问呢频率,值越小淘汰优先级越高。

 

Redis的数据都会被封装为RedisObject结构,根据所配置的淘汰策略,按需记录不同的值。

LFU的访问次数之所以叫逻辑访问次数,是因为并不是每次key被访问都计数,因为记录次数的只有八位,最多只能记录255次,所以是记录运算出的逻辑访问次数:

(1)生成0-1之间的一个随机数R

(2)计算1/ (旧次数*lfu_log_factor +1),记录为p,lfu_log_factor默认为10

(3)如果R<P,则计数+1,且最大不超过255

(4)访问次数会随时间衰减,记录上一次访问时间间隔lfu_decay_time分钟(默认1),计数器-1

 

 

posted @   wwwwwwwty  阅读(108)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示