概述
文章目录
- 1、过期数据
- 2、数据删除策略--针对有时效性的数据
- 3、逐出算法---与数据是否有时效性无关
1、过期数据
Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态:
- xx某数值:具有时效性的数据
- -1 :永久有效的数据
- -2 :已经过期的数据 或 被删除的数据 或 未定义的数据
过期数据会立即被删除吗?
这与我们设置的删除策略有关(定时删除、惰性删除、定期删除)
2、数据删除策略–针对有时效性的数据
Redis中,具有时效性的数据的存储结构如下:
数据删除策略,通俗的说就是CPU忙的时候别添乱,CPU不忙的时候去维护一下,把过期的处理掉。为的是在内存占用和CPU占用之间找到一种平衡
,顾此失彼则会导致Redis性能的下降甚至服务器宕机。
2.1 定时删除
创建一个定时器,当key设置的过期时间到了的时候,由定时器任务立即进行删除
优点:
节省内存,到点就删除
缺点:
CPU压力大,不管此时CPU忙不忙,到点干活儿,会影响Redis服务器的响应时间以及指令的吞吐
总结:
用CPU的性能换取存储空间(用时间换空间)
2.2 惰性删除
数据到达过期时间也不做处理,等下次访问这个数据的时候,若未过期,则返回数据。若过期,则删除并返回不存在。
优点:
节省CPU性能,发现必须删除的时候才删除
缺点:
内存压力大,出现长期占用内存的数据
总结:
用存储空间换取CPU性能(拿空间换时间)
2.3 定期删除
周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度.
示意图中展示了8个redis的库,expires[*]即每个库中设置有时效性的值,定期删除的实现步骤如下:
- Redis启动服务器初始化时,读取配置文件中#server中的 hz 的值,默认为10
- 每秒钟执行 hz 次
serverCron()
---->其中的databasesCron()
负责对每个库进行轮询—>再对每个库进行activeExpireCycle() activeExpireCycle()
对每个expires[*]逐一进行检测,每次执行250ms/server.hz- 对每个expires[*]进行检测,随机挑选其中的W个key来检测
- 删除超时的key,如果一轮中删除的
key的数量 > W*25%
(说明这个库有时效性的数据中过期比例高,需要重点清理
),则对这个库继续循环这两步 - 如果一轮中删除的
key的数量 <= W*25%
,则说明这个库过期数据相对较少,去检查下一个库的expires[*],共0-15号库
注:
- W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
- 参数current_db用于记录activeExpireCycle() 进入哪个expires[*] 执行,若activeExpireCycle()执行时间到期,下次从current_db继续向下执行
特点:
CPU性能占用设置有峰值,检测频度可自定义设置。内存压力不是很大,长期占用内存的冷数据会被持续清理。
总结:
周期性抽查存储空间(随机抽查,重点抽查)
三种删除策略对比如下:
策略 | 内存 | CPU | 总结 |
---|---|---|---|
定时删除 | 节约内存,无占用 | 不分时段占用CPU资源,频度高 | 拿时间换空间 |
惰性删除 | 内存占用严重 | 延时执行,CPU利用率高 | 拿空间换时间 |
定期删除 | 内存定期随机清理 | 每秒花费固定的CPU资源维护内存 | 随机抽查、重点抽查 |
3、逐出算法—与数据是否有时效性无关
3.1 概念
Redis使用内存存储数据,在执行每一个命令前,会调用
freeMemoryIfNeeded()
检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法
注:
逐出数据后,若还没清理出足够的空间,则反复执行,当所有数据尝试完毕后,还没达到要求的空间,则抛错:
3.2 配置文件中的相关参数
-
maxmemory
最大可使用内存,占用物理内存的比例,默认为0,表示不限制 -
maxmemory-samples
每次选取的待删除的数据的个数。逐出算法选数据并不是全盘扫描,而是随机获取。这个值过小,则导致每次逐出算法反复执行,过大则导致严重的性能消耗 -
maxmemory-policy
达到最大内存后的,对被挑选出来的数据进行删除的策略
maxmemory-policy可选
:
-
检测易失数据(可能会过期的数据集server.db[i].expires )
① volatile-lru:挑选最近最少使用的数据淘汰, Least Recently Used
② volatile-lfu:挑选最近使用次数最少的数据淘汰, Least Frequently Used
③ volatile-ttl:挑选将要过期的数据淘汰
④ volatile-random:任意选择数据淘汰
通俗的说:LRU就是最近好几天没来上班的人,LFU就是来上班了但是用处很少的人
-
检测全库数据(所有数据集server.db[i].dict )
⑤ allkeys-lru:挑选最近最少使用的数据淘汰
⑥ allkeys-lfu:挑选最近使用次数最少的数据淘汰
⑦ allkeys-random:任意选择数据淘汰 -
放弃数据驱逐
⑧ no-enviction(驱逐):
禁止驱逐数据(redis4.0中默认策略),会引发错误OOM(Out Of Memory)
以上八种策略的选择:
使用info指令,查询缓存 hit 和 miss (命中和丢失)的次数,根据业务需求调优Redis配置
最后
以上就是满意中心为你收集整理的【Redis学习笔记】第八章 Redis删除策略1、过期数据2、数据删除策略–针对有时效性的数据3、逐出算法—与数据是否有时效性无关的全部内容,希望文章能够帮你解决【Redis学习笔记】第八章 Redis删除策略1、过期数据2、数据删除策略–针对有时效性的数据3、逐出算法—与数据是否有时效性无关所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复