Redis —— LRU和LFU

目录

一、过期策略

二、maxmemory策略

三、LRU算法

四、LFU算法


一、过期策略

如上图所示,需注意问题:

1. 两种过期策略同时存在:定时删除是基于redis异步线程的定时任务serverCron,完成对过期key的集中删除。默认hz配置是:定时任务每秒10次扫描,每次不能超出25ms

# redis定时删除过期key,每秒10次
hz 10

# 启动动态hz,查看客户端连接数和CPU使用等情况,动态改变hz值
dynamic-hz yes

2. 定时删除的循环:大量key同一时间过期("雪崩"),造成循环扫描,导致服务卡顿。解决redis的雪崩问题:过期时间 + 随机时间

3. 惰性删除:客户端访问key时,判定key是否过期,若过期则删除。但是若key长时间没有访问时,大量key没有被及时删除导致内存占用大

4.从节点过期策略:被动删除,只有主节点发生删除,并同步到从节点

二、maxmemory策略

如上图所示,需注意问题:

1. 淘汰策略目的:防止Redis使用内存超出物理内存

2. maxmemory策略:默认noeviction(禁写可读),除del写外。volatile-xxx:淘汰范围是设置过期的key;allkeys-xxx:淘汰范围是所有的key。如下图所示是内存相关配置:

# Redis内存管理
############################## MEMORY MANAGEMENT ################################

# 设置Redis最大使用内存,超出时触发maxmemory-policy配置,淘汰key
# maxmemory <bytes>

# key的淘汰策略
# maxmemory-policy noeviction

# 随机抽取key的个数
# maxmemory-samples 5

# 从节点是否忽略maxmemory的设置
# replica-ignore-maxmemory yes

# 调节过期占用比率
# active-expire-effort 1

3. 淘汰算法:LRU算法、LFU算法

三、LRU算法

如上图所示,需注意问题:

1. LRU(Least Recently Used):最近最少使用,但不能判定key是"热"key,长时间没有被访问的key,最近偶尔出现一次,LRU算法是不会淘汰该key

2. 空闲时间:越长优先淘汰,计算空闲时间规则如下图所示:

3.近似LRU算法:严格LRU算法需要改动redis现有结构很大,成本高。近似算法在每个key新增一个24bit,存放:最近访问时间戳。这个时间戳参与计算空间时间

四、LFU算法

如上图所示,需注意问题: 

1. LFU(Least Frequently Used):最近频率使用,根据key的访问频率来淘汰。从而"冷"key的LRU中不能淘汰,而LFU被淘汰,更能准确淘汰

2. log(访问频率):比较key的访问频率的对数值,越小优先淘汰。LFU更新时间的同时,也会随着时间衰减logc的值(默认衰减系为1;>1:衰减慢;=0:不衰减)计算访问频率规则如下图所示:

3. LRU与LFU的比较:

比较LRULFU
redisObject对象头redisObject.lru(24bit)redisObject.lru(24bit)= 频率的对数值logc(8bit) + logc的更新时间(16bit)
访问时间戳精确度msmin
取模折返毫秒时间戳 % 2^24分钟时间戳 % 2^16
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值