目录
一、过期策略
如上图所示,需注意问题:
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的比较:
比较 | LRU | LFU |
redisObject对象头 | redisObject.lru(24bit) | redisObject.lru(24bit)= 频率的对数值logc(8bit) + logc的更新时间(16bit) |
访问时间戳精确度 | ms | min |
取模折返 | 毫秒时间戳 % 2^24 | 分钟时间戳 % 2^16 |