_01Redis删除策略

首先我们先说一下redis删除的是过期数据,而什么是过期数据呢

过期数据是设置了又时效性的数据,到达了过期时间的数据

TTL指令可以获取数据状态

  •  返回时间:具有时效性的数据
  • 返回-1:表示永久有效的数据
  • 返回-2:表示数据已经过期或者未被定义

1.定时删除

  •   创建一个定时器,当key到达时间时,由定时器任务立即执行对key的删除操作(这里删除是将key和expires区域的数据全部删除)
  • 优点:节约内存,不用的数据可以快速释放
  • 缺点:对cpu的压力大,无论cpu此时负载量多高,均占用cpu,会影响redis服务器的响应时间和指令吞吐量
  • 一句话:用cpu性能换内存

2.惰性删除

  • 数据到期时不做删除,等下次访问时进行删除
    •  如果未过期返回数据
    • 如果过期返回null
  •  有点:节约cpu的性能,发现必须删除的时候才删除
  •     缺点:长期占用大量内存
  • 一句化:拿内存换cpu性能

3.定期删除

    • redis启动服务器初始化时,读取配置server.hz的值,默认是10(如图)
      在这里插入图片描述
      在这里插入图片描述
    • 每秒钟执行server.hz次serverCron()(对服务器进行定时轮询)→ databasesCron()(对redis中每一个库进行访问)→activeExpireCycle()
    • activeExpireCycle()对每一个expires[*]逐一进行检测,每次执行250ms/server.hz
    • 对某一个expires[*]检测时,随机挑选W个key检测
      • 如果key超时,删除key
      • 如果一轮中删除的key数量>W*25%,继续检测该expires(循环该过程)
      • 如果一轮中删除的key数量<=W*25%,则检查下一个expires
      • W=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
    • 参数current_db用于记录activeExpireCycle()进入哪个expires[*]执行(防止轮询时把某个expires落下)
    • 如果activeExpireCycle()执行时间到期,下次从current_db继续向下执行
    • 简单说就是周期性轮询redis库中的有时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度
    • 特点1:CPU性能占用设置有峰值,检测频度可自定义设置
    • 特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理
    • 总结:周期性抽查存储空间
posted @ 2021-01-30 20:23  小啊giao学渣蛙  阅读(68)  评论(0)    收藏  举报