DBA Redis 清理策略
删除策略
基本介绍
Redis数据存放在内存中,具有3种删除策略:
- 定时删除
- 惰性删除
- 定期删除
定时删除
之前介绍过几种对Redis的键做时效性的设置:
通用:
expireat
pexpireat
字符串:
setex
psetex
查询:
TTL
PTTL
定时删除的策略无外乎对key做这种时效性操作,当到期后则执行自动删除的策略。
优点:节约内存,到时就删,释放比较快速
缺点:CPU压力大,在key到期时,无论CPU多么繁忙,它都会让CPU把自己立马删除,会影响Redis服务器响应时间和指令吞吐量
总结:时间换空间,CPU性能换存储空间
惰性删除
当数据到达过期时间后,不做任何处理,等待下次访问数据时做操作:
- 如果未过期,返回数据
- 如果过期了,删除,返回不存在
优点:节约CPU性能,发现到了非删不可的时候才删
缺点:内存压力大,会出现长期占用内存的数据
总结:用存储空间换区处理器性能,也就是时间换空间
定期删除
周期性的轮询Redis数据库中时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。
特点1:CPU性能占用设有峰值,检测频度可自定义设置
特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理
总结:周期性抽查内存空间(随机抽查、重点抽查)
逐出算法
基本介绍
逐出算法指的是当有新的数据进行插入,此时内存却又不足该怎么办。
总共有8种逐出算法。
- Redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如 果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据 的策略称为逐出算法。
- 注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所 有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。
相关配置
以下的配置是影响数据逐出的因素:
1)最大可使用内存:
maxmemory
占用物理内存的比例,默认为0代表不受限制,生成中建议设置为50%左右。
2)每次选取待删除数据的个数:
maxmemory-samples
选取数据时并不会全库扫描,因为这导致严重的性能消耗,降低读写性能。
故采用随机获取数据的方式作为待检测删除数据
3)删除策略
maxmemory-policy
达到最大内存后,对被挑选出来的数据进行删除的策略
相关算法
检测易失数据(可能会过期的数据集server.db[i].expires ) :
- volatile-lru:挑选最近最少使用的数据淘汰
- volatile-lfu:挑选最近使用次数最少的数据淘汰
- volatile-ttl:挑选将要过期的数据淘汰
- volatile-random:任意选择数据淘汰
检测全库数据(所有数据集server.db[i].dict ):
- allkeys-lru:挑选最近最少使用的数据淘汰
- allkeys-lfu:挑选最近使用次数最少的数据淘汰
- allkeys-random:任意选择数据淘汰
放弃数据驱逐:
- no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发错误OOM(Out Of Memory)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· 一个适用于 .NET 的开源整洁架构项目模板
· API 风格选对了,文档写好了,项目就成功了一半!
· 【开源】C#上位机必备高效数据转换助手
· .NET 9.0 使用 Vulkan API 编写跨平台图形应用
· MyBatis中的 10 个宝藏技巧!