signed

QiShunwang

“诚信为本、客户至上”

Redis删除策略与淘汰策略详解

2021/6/3 18:37:40   来源:

Redis删除策略与淘汰策略

快速入门Redis的文章,传送地址:入门Redis看这篇就够了

文章目录

  • Redis删除策略与淘汰策略
    • 一、删除策略
      • 1. 定时删除
      • 2. 惰性删除
      • 3. 定期删除
    • 二、淘汰策略
      • 1. 影响数据淘汰的相关配置
      • 2. 淘汰策略

一、删除策略

  • 过期数据指的是TTL指令返回 -2 的数据

  • 时效性数据的存储结构

    image-20210517160033220

    数据的时效信息是一块独立的存储空间,Hash结构,field是数据的内存地址,value是过期时间,当时间到期后通过field找到该数据在内存中的地址,进行相关的操作

  • 数据删除策略有三种:定时删除、惰性删除、定期删除

    • 这三种策略删除的是已过期的数据

1. 定时删除

  • 创建一个定时器,当key的过期时间到达时,立即执行对key的删除操作
  • 优点:节约内存,到时就删除,快速释放不必要的内存占用
  • 缺点:CPU压力大,会影响Redis服务器响应时间(无论CPU是否繁忙,到时间就要执行删除操作)
  • 总结:处理器性能换存储空间 (时间换空间)

2. 惰性删除

  • 即使数据到达过期时间,也不做处理(一直存在),下次访问(get)该数据时,进行判断:

    • 如果未过期,返回数据

    • 如果已过期,删除,返回不存在

  • 优点:节约CPU性能,并不会立即删除

  • 缺点:内存压力大,出现长期占用内存的数据 (到期之后长时间不执行get操作)

  • 总结:用存储空间换取处理器性能 (空间换时间)

  • 注意:执行get指令时,Redis会隐性的先执行expireIfNeeded(),判断数据是否已经过期

3. 定期删除

  • Redis数据库的存储空间

    image-20210517162438081
  • 定期删除的具体流程

    image-20210517162720984
  • 注意

    • 根据默认值,activeExpireCycle() 一秒钟检测10次,根据公式得出每次检测耗时25ms,即一秒钟执行检测的时间为250ms (占用cpu1/4时间)
    • 如果 activeExpireCycle() 执行时间到期 (只可占用CPU的1/4时间),下次从 (current_db + 1) % 16 继续向后执行
  • 总结

    • 定期删除就是周期轮询Redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度
    • 内存压力不是很大,CPU压力不是很大
    • 检测频度可自定义设置

二、淘汰策略

  • 当新数据进入Redis时,如果内存不够,需要删除一些数据

    • 删除的是没有过期的数据
    • 删除策略删除的是已过期的数据
  • 注意

    • Redis在执行每个指令前,会调用 freeMemoryIfNeeded() 检测内存是否充足且释放内存

    • 淘汰数据并不是100%会成功的,如果失败,会反复执行;如果所有数据均尝试完毕,还不能达到内存的需求,将出现如下错误信息

      img

1. 影响数据淘汰的相关配置

  • 分配给Redis的最大内存,通常设置为占用物理内存的50%以上

    image-20210517165517426
  • 每次随机选择的待删除数据的个数(选取数据时不会全库扫描,会导致严重的性能消耗)

    image-20210517165539798
  • 对数据进行淘汰的策略(达到最大内存后,对被挑选出来的数据进行删除的策略)

    image-20210517165557839

2. 淘汰策略

淘汰策略分为三大类,如下所示:

  • 检测易失(非永久)数据(检测过期数据集 server.db[i].expires)

    image-20210517165822029
  • 检测全库数据(检测所有数据集 server.db[i].dict)

    image-20210517165846875
  • 放弃数据驱逐(不淘汰数据)

    image-20210517165928306