目录
过期数据
redis中的数据特征
redis是一种基于内存的数据库,所有的数据均存放于内存中,内存中的数据可以通过TTL指令获取状态
xx:具有时效性的数据
-1: 永久有效的数据
-2:已经过期的数据 或 被删除的数据 或 未定义的数据
数据删除策略
定时删除
惰性删除
定期删除
redis存储数据的方式
在expire存储的东西为两个,一个内存的地址,另一个是过期时间
数据删除的目标:是在内存和cpu占用之间寻找一种平衡,顾此失彼都会造成redis的性能下降,甚至引发服务器宕机或者内存泄漏
定时删除
创建一个定时器,当key设置有过期时间,且过期时间到达,由定时器任务立即执行对键的删除操作
优点:节省内存,到时就进行删除,快速释放到不必要的内存
缺点:cpu压力很大,因为到时间就要删除,不考虑cpu负载量多高,均会占用cpu,会影响redis服务器响应时间和指令的吞吐量
用处理器的性能换取内存空间
惰性删除
数据到达过期时间,不作处理,等下次访问这条数据的时候
如果未过期,返回数据
如果已经过期,删除,返回不存在
优点:节约cpu性能
缺点:大量数据存在与内存中,
用存储器空间获取处理服务器性能
定期删除
折中方案
redis启动的时候,server.hz,默认值为10
每秒执行server.hz次操作 ,对服务器进行定时轮询,对expires进行轮询。逐个检查,随机选择出w个key进行检测,如果一轮中删除的key的数量> W*25,循环过程。如果这一轮删除的key小于w,检查下一个expires
W可以自己定义
周期性轮询redis数据库,进行随机抽取的策略,利用过期数据占比方式控制删除频度
特点1:cpu性能占用设置有峰值,检测频度可以自定义设置
特点2:内存压力不是特别大,长期占用内存的冷数据会被持续清理。
总结:周期性抽查空间(随机抽查,重点抽查)
逐出算法
当新数据进入redis时,如果内存不足怎么办
redis在使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNedded()函数去检测空间是否充足。如果不满足新加入数据的最低存储要求,redis要求临时删除一些数据为当前指令清除空间,清理数据的策略为逐出算法
注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功就反复执行,当对所有的数据尝试完毕,如果还不能达到内存清理的要求,将出现错误信息。
相关影响逐出的相关配置
maxmemory
占用物理比例为0,表示不限制,生产环境通常在50%以上
每次待选取删除数据的个数
maxmemory-samples
选取数据的时候并不会全库扫描,导致严重的性能消耗,降低读写性能,因此采用随机获取数据的方式作为待检测删除数据。
删除策略
maxmemory-policy
达到最大内存之后,选择的删除策略
检测易失数据(可能会过期的数据集)
检测全库数据
放弃驱逐数据
数据逐出策略配置依据
使用INFO命令输出监控信息,查询缓存hit和miss的次数,根据业务需要调优Redis配置