DBA Redis 清理策略
删除策略
基本介绍
Redis数据存放在内存中,具有3种删除策略:
- 定时删除
- 惰性删除
- 定期删除
定时删除
之前介绍过几种对Redis的键做时效性的设置:
通用:
expireat
pexpireat
字符串:
setex
psetex
查询:
TTL
PTTL
定时删除的策略无外乎对key做这种时效性操作,当到期后则执行自动删除的策略。
优点:节约内存,到时就删,释放比较快速
缺点:CPU压力大,在key到期时,无论CPU多么繁忙,它都会让CPU把自己立马删除,会影响Redis服务器响应时间和指令吞吐量
总结:时间换空间,CPU性能换存储空间
惰性删除
当数据到达过期时间后,不做任何处理,等待下次访问数据时做操作:
- 如果未过期,返回数据
- 如果过期了,删除,返回不存在
优点:节约CPU性能,发现到了非删不可的时候才删
缺点:内存压力大,会出现长期占用内存的数据
总结:用存储空间换区处理器性能,也就是时间换空间
定期删除
周期性的轮询Redis数据库中时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。
特点1:CPU性能占用设有峰值,检测频度可自定义设置
特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理
总结:周期性抽查内存空间(随机抽查、重点抽查)
逐出算法
基本介绍
逐出算法指的是当有新的数据进行插入,此时内存却又不足该怎么办。
总共有8种逐出算法。
- Redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如 果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据 的策略称为逐出算法。
- 注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所 有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。
相关配置
以下的配置是影响数据逐出的因素:
1)最大可使用内存:
maxmemory
占用物理内存的比例,默认为0代表不受限制,生成中建议设置为50%左右。
2)每次选取待删除数据的个数:
maxmemory-samples
选取数据时并不会全库扫描,因为这导致严重的性能消耗,降低读写性能。
故采用随机获取数据的方式作为待检测删除数据
3)删除策略
maxmemory-policy
达到最大内存后,对被挑选出来的数据进行删除的策略
相关算法
检测易失数据(可能会过期的数据集server.db[i].expires ) :
- volatile-lru:挑选最近最少使用的数据淘汰
- volatile-lfu:挑选最近使用次数最少的数据淘汰
- volatile-ttl:挑选将要过期的数据淘汰
- volatile-random:任意选择数据淘汰
检测全库数据(所有数据集server.db[i].dict ):
- allkeys-lru:挑选最近最少使用的数据淘汰
- allkeys-lfu:挑选最近使用次数最少的数据淘汰
- allkeys-random:任意选择数据淘汰
放弃数据驱逐:
- no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发错误OOM(Out Of Memory)