_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:内存压力不是很大,长期占用内存的冷数据会被持续清理
- 总结:周期性抽查存储空间



浙公网安备 33010602011771号