Redis过期key清除和内存淘汰

首先:

过期清除(只针对设置过期的key)、内存淘汰(可以针对所有key,或设置过期的key

设置了过期时间的key,Redis会单独存储(Redis每个库分别用两个字典来存过期与没过期的key

过期清除

Redis选用了两种过期键的清除策略(并不会采用定时删除因为太占CPU资源了

        1定期删除:每间隔100ms毫秒随机抽取设置过期的key(因为lru_lock是100ms更新一次)

        2惰性删除:在访问key的时候发key过期了才删除(缺点:会占用很多内存)

内存淘汰

如果过期键清除没有解决内存占满的问题(或者说内存达到了设置的上限),那么还有内存淘汰策略

(4.0以后)一共有8种过期淘汰策略(默认对写请求返回错误)

先熟悉几个词的意思:

allkeys:对所有的key无论是否设置了过期时间。 

volatile: 针对所有了过期key。

LRU:(删除最近最少使用)lru时钟 - lru属性

LFU:(删除访问频率最少)lru属性:时间戳实现 + counter

Random:(随机删除)

TTl:(删除马上过期的key)

8中策略分别是:

1、noeviction:当内存使用满了的时候对写返回错误,不会删除任何键(默认)
2、 allkeys-lru:所有键中删除最久没有使用的键
3、 volatile-lru:过期键中删除最久没有使用的键
4、 allkeys-random:所有键随机删除
5、volatile-random:过期键随机删除
6、allkeys-lfu:所有键中删除使用频率最少的键
7、volatile-lfu:过期键中删除使用频率最少的键
8、volatile-ttl:过期键中删除马上就要过期的键

redis的LRU的实现

redis用的是改进的LRU算法:

        不存LRU队列(省空间)而是抽样删除,配置文件默认5。maxmemory_samples 5  意思是随机抽取5个key在按照LRU删除,key的数量越大越效果越好就很好(越准确,越接近LRU)。

        每个key(redisObject) 用lru属性记录这个key的最后一次访问时间。Redis 中的全局属性 lru_clock (lru时钟)每间隔100ms毫秒更新一次(这样优化不用每次淘汰计算都调系统时间),然后在用这个 lru时钟 - key 的 lru 计算未被访问的时间。

        key的lru记录时间戳,24位最多纪录194天,当超过194天变为从0开始算导致(lru时钟 < lru),就应该用 lru_clock  - (lru + lrulock_max(194)) 这个公式。

redis的LFU的实现

每个key的lru属性记录时间戳,24位:

高16位: 用来记录最后一次访问时间(单位分钟) 一段时间不被访问减少counter用

低 8 位: 用来记录访问频率(概率计数器counter),8位二进制最大表示255。

因counter最大只能表示255,所以不能单纯的被访问后就做+1的操作。

做法是这样的:

        1、 当一个key被访问时,counter递增方式:在0与1之间取随机数R

        2、 counter - 初始值(默认 5),得到基础差值,如果基础差值小于0就取0。
        概率 P  = 1/(基础差值 * 对数因子 + 1)。
        3、 如果 随机数R < 概率P 时,频次递增(counter++)

配置文件 对数因子 默认10:lfu_log_factor  10

lfu_log_factor 为 10 时,大概是 1M(100万次)达到255

lfu_log_factor 为 100   时,大概是 10M(1000万次)达到255

        counter 只做递增不能完全反应一个 key 的热度,所以当 key 一段时间不被访问之后,counter 需要对应减少。

当前的时间戳(分钟)和对象中的 lru 属性(分钟)进行对比,看已经过了多少分钟没有被访问,然后除配置文件参数。counter减去结果

配置文件 衰败 默认1: lfu-decay-time 1  表示:N分钟没被访问过就衰败N/1,当分母用。

规律:

         1、 counter值越大,递增概率越低

        2、 lfu-log-factor 对数因子设置越大,递增概率越低

当访问次数counter越来越大时,或者lfu-log-factor参数配置过大时,counter递增的概率都会越来越低

        3、 lfu-decay-time 衰败 配置过大,则counter衰减会变慢,因为他当作被除数(分母)


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值