过期数据

设置了有效期又到达了有效期的数据。

怎么存储过期数据的?

redis开辟了一片内存空间,hash的存储结构,field就是失效数据的内存地址,value就是失效的时间,有了这个我们就知道哪些数据是需要删除的。

删除策略

定时删除

创建一个定时器去执行对key的删除操作,删除key数据的同时,删除expire内存区保存的地址信息。
优点:解决内存,快速释放掉不必要的内存
缺点:抢占CPU,CPU负载高时,影响redis指令的响应时间和吞吐量

惰性删除

数据到达过期时间,不做处理,直到下次访问的时候才去删除,也就是每一次的get操作都会和expireIfNeeded()相绑定,数据不到期就返回数据,到期就删除返回null.
优点:节约CPU性能
缺点:大量失效数据积压之后,内存占用大,存储空间压力大。

定期删除

相比前两个,一个比较折中的方案。
周期性轮询redis库中的时效性数据,采取随机抽取的策略,利用过期数据占比的方式来控制删除频度
特点:检查频度自定义;长期占用内存的数据会被持续清理;周期性检查存储空间。
随机抽查,重点检查。

逐出策略

前面是key失效的情况,要是所有数据都没有过期。甚至都是永久有效的,内存不够了,怎么办?

redis在使用内存存储数据的时候,在执行每一个命令之前,会调用freeMemoryIfNeeded()检查内存是否充足,如果不满足当前添加数据的要求,会临时清理一些数据作为新指令需要的内存空间。这个也叫逐出算法。

注意:逐出数据的过程不一定能够清理出足够的空间,如果不成功则反复执行,当对所有数据都尝试了之后,还是不能满足要求,将报错。

影响逐出的几个配置:

  • 最大内存:占用物理内存的比例,默认0,不限制,一般设定50%以上
  • 每次待选取删除的个数:随机获取的方式获取待检测的数据(一般不会全库扫描,影响性能)
  • 删除策略

    具体策略

    检测易失数据

  • volatile-lru : 挑选最近最少使用的数据进行淘汰

  • volatile-lfu:挑选最近使用次数最少的数据进行淘汰
  • volatile-ttl:挑选将要过期的数据进行淘汰
  • volatile-random:任意选择数据淘汰

    检测全库数据

  • allkeys-lru

  • allkeys-lfu
  • allkeys-random

    放弃驱逐策略

  • no-enviction 禁止驱逐策略,可能引发OOM