Redis技术知识总结之三——Redis数据淘汰机制

7 篇文章 0 订阅

接上篇《Redis技术知识总结之二——Redis线程模型》

三. Redis 的数据淘汰机制

3.1 Redis 的数据淘汰策略

当 Redis 内存超出物理内存限制时,为了保持高效的可用性,Redis 需要对内存中部分数据进行淘汰。Redis 早起版本使用的数据淘汰策略是 LRU (Least Recently Used,最近最少使用) 策略,LRU 策略是基于最近访问时间进行排序、淘汰的。后来加入了 LFU (Least Frequency Used,最近最低频率) 策略。
Redis 主要使用的还是 LRU 策略。

  • noeviction: 可以继续读请求,不可以进行写请求。
    • 返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但 DEL 和几个例外);
    • 默认淘汰策略。
  • volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在设置了过期时间的键,使得新添加的数据有空间存放。
  • volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在设置了过期时间的键
  • volatile-ttl: 回收设置了过期时间的键,淘汰策略是优先回收剩余时间 (TTL) 较短的键,使得新添加的数据有空间存放。
  • allkeys-lru: 对全部集合进行回收,尝试回收最少使用的键 (LRU),使得新添加的数据有空间存放。
  • allkeys-random: 对全部集合进行回收,回收随机的键使得新添加的数据有空间存放。
  • volatile-lfu: 对设置了过期时间的键进行 LFU 策略的过期筛选;
  • allkeys-lfu: 对全部的键进行 LFU 策略的过期筛选;

3.2 LRU 策略

Redis 的数据都是由 key-value 形式构成的,在实现 LRU 的内存淘汰机制时,除了 key-value,LRU 还需要维护一个列表,链表尾部的数据是最少被访问的数据。列表按照最近访问时间进行排序。当内存达到物理内存限制触发 LRU 回收时,对链表尾部的 k-v 进行回收。

但 Redis 的 LRU 并不是这样执行的,Redis 使用了一种近似 LRU 算法。对于所有 Redis 对象,对象头中包含一个 24bit 的信息,作为对象热度的标志。在 LRU 淘汰算法中,该标志是一个时间戳,记录了最近一次访问该标志位的时间。
在触发了 LRU 淘汰时,Redis 会随机抽取若干个(默认是 5 个)key,然后删掉最旧的 key。如果这时候内存依旧超出限制,则再次抽选、删除最旧的 Key 值,直到内存低于最大内存限制为止。

Redis Object 的对象头如下所示:

typedef struct redisObject {
    // 对象类型,如 zset, set, hash 等
    unsigned type: 4; 
    // 对象编码如 ziplist, inset, skiplist 等
    unsigned encoding: 4;
    // 对象的热度
    unsigned lru: 24;
    // 引用计数
    int refcount;
    // 对象的 body
    void *ptr;
}

其中,lru 值即为表示热度的值。在 LRU 模式下,该字段存储的时间戳是 Redis 服务器的时钟信息 server.lruclock,单位为毫秒。server.lruclock 持续更新,某对象被访问时,对象头中的 LRU 值被更新为当前 server.lruclock 的值,最后当触发 LRU 内存淘汰时,该对象的 LRU 值会与当前 server.lruclock 进行取模等一系列运算,即可得到 LRU 值。

3.3 LFU 策略

LFU 策略与 LRU 的计算方式大致相同,都是根据 Redis 对象头的 LRU 值与 server.lruclock 值进行计算的。但是 LFU 策略下,24bit 的 lru 值被分为 16+8 两部分。

  • ldt (last decrement time,): 前 16 位,记录上一次更新时间,计算单位是分钟。
    • ldt 不是对象被访问的时候被更新,而是在 Redis 触发淘汰逻辑时进行更新;
  • logc (logistic counter,对数计数): 后 8 位记录频率信息,且以对数形式储存,计算单位是分钟。
    • logc 有衰减算法,在 ldt 更新时触发。当前 logc 值减去对象空闲时间,除以一个衰减系数;
    • 由于 logc 的统计的是对数信息,所以它的 +1 策略是基于概率的 +1;于是当对数值越大时,+1 操作概率越小,就越难被更新。大致流程如下:
      1. 计算差值:当前对数值 - 基值 (5)
      2. 计算更新 +1 操作概率:p = 1 / 差值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值