• 【Redis学习笔记】第八章 Redis删除策略



    在这里插入图片描述



    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配置

    在这里插入图片描述

  • 相关阅读:
    MySQL - 在 Windows 上安装 MySQL
    Git下载安装及环境配置,解决安装包下载慢问题(详细版)
    Python3 中的 random模块
    GMS地下水数值模拟丨GMS各模块、三维地质模型构建及与MODFLOW耦合、地下水流动数值模拟及报告编制、地下水溶质运移模型、反应性溶质运移等
    【剑指offer系列】44. 数字序列中某一位的数字
    『吴秋霖赠书活动 | 第二期』《ChatGPT原理与实战》
    windows如何更改/禁用系统更新
    Android使用Zxing库生成PDF417扫描后多一个字符A
    介绍一下js垃圾回收机制
    GBase 8c 数据库内置角色
  • 原文地址:https://blog.csdn.net/llg___/article/details/126438292