过期数据
怎么存储过期数据的?
redis开辟了一片内存空间,hash的存储结构,field就是失效数据的内存地址,value就是失效的时间,有了这个我们就知道哪些数据是需要删除的。
删除策略
定时删除
创建一个定时器去执行对key的删除操作,删除key数据的同时,删除expire内存区保存的地址信息。
优点:解决内存,快速释放掉不必要的内存
缺点:抢占CPU,CPU负载高时,影响redis指令的响应时间和吞吐量
惰性删除
数据到达过期时间,不做处理,直到下次访问的时候才去删除,也就是每一次的get操作都会和expireIfNeeded()相绑定,数据不到期就返回数据,到期就删除返回null.
优点:节约CPU性能
缺点:大量失效数据积压之后,内存占用大,存储空间压力大。
定期删除
相比前两个,一个比较折中的方案。
周期性轮询redis库中的时效性数据,采取随机抽取的策略,利用过期数据占比的方式来控制删除频度
特点:检查频度自定义;长期占用内存的数据会被持续清理;周期性检查存储空间。
随机抽查,重点检查。
逐出策略
前面是key失效的情况,要是所有数据都没有过期。甚至都是永久有效的,内存不够了,怎么办?
redis在使用内存存储数据的时候,在执行每一个命令之前,会调用freeMemoryIfNeeded()检查内存是否充足,如果不满足当前添加数据的要求,会临时清理一些数据作为新指令需要的内存空间。这个也叫逐出算法。
注意:逐出数据的过程不一定能够清理出足够的空间,如果不成功则反复执行,当对所有数据都尝试了之后,还是不能满足要求,将报错。
影响逐出的几个配置: