DBA Redis 清理策略

删除策略

基本介绍

Redis数据存放在内存中,具有3种删除策略:

  • 定时删除
  • 惰性删除
  • 定期删除

定时删除

之前介绍过几种对Redis的键做时效性的设置:

通用:
    expireat
    pexpireat
    
字符串:
    setex
    psetex
    
查询:
    TTL
    PTTL

定时删除的策略无外乎对key做这种时效性操作,当到期后则执行自动删除的策略。

优点:节约内存,到时就删,释放比较快速

缺点:CPU压力大,在key到期时,无论CPU多么繁忙,它都会让CPU把自己立马删除,会影响Redis服务器响应时间和指令吞吐量

总结:时间换空间,CPU性能换存储空间

惰性删除

当数据到达过期时间后,不做任何处理,等待下次访问数据时做操作:

  1. 如果未过期,返回数据
  2. 如果过期了,删除,返回不存在

优点:节约CPU性能,发现到了非删不可的时候才删

缺点:内存压力大,会出现长期占用内存的数据

总结:用存储空间换区处理器性能,也就是时间换空间

定期删除

周期性的轮询Redis数据库中时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。

特点1:CPU性能占用设有峰值,检测频度可自定义设置

特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理

总结:周期性抽查内存空间(随机抽查、重点抽查)

逐出算法

基本介绍

逐出算法指的是当有新的数据进行插入,此时内存却又不足该怎么办。

总共有8种逐出算法。

  • Redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如 果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据 的策略称为逐出算法。
  • 注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所 有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。

相关配置

以下的配置是影响数据逐出的因素:

1)最大可使用内存:

maxmemory

占用物理内存的比例,默认为0代表不受限制,生成中建议设置为50%左右。

2)每次选取待删除数据的个数:

maxmemory-samples

选取数据时并不会全库扫描,因为这导致严重的性能消耗,降低读写性能。

故采用随机获取数据的方式作为待检测删除数据

3)删除策略

maxmemory-policy

达到最大内存后,对被挑选出来的数据进行删除的策略

相关算法

检测易失数据(可能会过期的数据集server.db[i].expires ) :

  1. volatile-lru:挑选最近最少使用的数据淘汰
  2. volatile-lfu:挑选最近使用次数最少的数据淘汰
  3. volatile-ttl:挑选将要过期的数据淘汰
  4. volatile-random:任意选择数据淘汰

检测全库数据(所有数据集server.db[i].dict ):

  1. allkeys-lru:挑选最近最少使用的数据淘汰
  2. allkeys-lfu:挑选最近使用次数最少的数据淘汰
  3. allkeys-random:任意选择数据淘汰

放弃数据驱逐:

  1. no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发错误OOM(Out Of Memory)
posted @   云崖君  阅读(75)  评论(0编辑  收藏  举报
编辑推荐:
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
阅读排行:
· 一个适用于 .NET 的开源整洁架构项目模板
· API 风格选对了,文档写好了,项目就成功了一半!
· 【开源】C#上位机必备高效数据转换助手
· .NET 9.0 使用 Vulkan API 编写跨平台图形应用
· MyBatis中的 10 个宝藏技巧!
点击右上角即可分享
微信分享提示