redis的一些高级特性(1)
Redis数据删除和淘汰策略
1 数据删除
1.1 为什么要删除数据?
由于redis数据是存放在内存中的,内存的大小是有限的,且部分数据是有时间限制的.在redis中,我们获取数据状态分为3中情况, 整数 (可存活时间[s]) , -1 (永久态) ,-2 (已过期).针对已过期的数据,我们要进行一些删除操作 [当然,我们对非过期数据也是可以操作的].
1.2 时效数据的存储结构

1.3 删除数据的策略
1 定时删除
创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
- 优点:节约内存,到时就删除,快速释内存占用
- 缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量
- 总结:用cpu性能 换取 存储空间
2 惰性删除
数据到达过期时间,不做处理。等下次访问该数据时,我们需要判断
- 如果未过期,返回数据
- 发现已过期,删除,返回不存在
这种方式的优缺点
- 优点:节约CPU性能,发现必须删除的时候才删除
- 缺点:内存压力很大,出现长期占用内存的数据
- 总结:用 存储空间 缓解 cpu性能 不足
3 定期删除
定期删除是 对 定时删除 和 惰性删除 的结合.既兼顾了cup性能压力,也考虑了内存不足问题.
具体操作策略:
Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。
1 从过期字典中随机w个key;
2 删除这w个key中已经过期的 key;
3 如果过期的key比率超过 1/4,那就 重复操作1;
这样,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。
当超时时:
- 用参数current_db记录activeExpireCycle() 进入哪个expires[*] 执行
- 如果activeExpireCycle()执行时间到期,下次从current_db继续向下执行
2 淘汰策略
2.1 什么叫数据淘汰策略?什么样的应用场景需要用到数据淘汰策略?
当新数据进入redis时,如果内存不足怎么办?在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如果内存不满足新 加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法。
注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕, 如不能达到内存清理的要求,将出现错误信息如下
(error) OOM command not allowed when used memory >'maxmemory'
2.2 数据删除策略 [3类 8种]
第一类:检测易失数据(可能会过期的数据集server.db[i].expires )
volatile-lru[least recently used]:挑选长时间未使用数据淘汰
volatile-lfu[least frequently used]:挑选最近使用次数最少的数据淘汰
volatile-ttl:挑选将要过期的数据淘汰
volatile-random:任意选择数据淘汰
第二类:检测全库数据(所有数据集server.db[i].dict )
allkeys-lru:挑选长时间未使用数据淘汰
allkeLyRs-lfu::挑选最近使用次数最少的数据淘汰
allkeys-random:任意选择数据淘汰,相当于随机
第三类:放弃数据驱逐
maxmemory-policy volatile-lru

浙公网安备 33010602011771号