Redis删除策略

卑微小吴励志写博客第29天。

删除策略

过期删除

redis中的数据特征
  • redis是一种内存级数据库,所有的数据均存储在内存中,通过TTL指令可以查看数据的状态。
    xx:具有时效性的数据
    -1:代表永久性数据
    -2:已经过期的数据 或 已经删除了的数据 或 未定义的数据

已经过期的数据真的被删除了吗?
Redis删除策略
redis让cpu处理很多指令的时候,cpu一下子处理不过来,但是删除的操作又没那么重要。所以就先没删,继续保存在内存中,什么时候删除呢?这就是redis的删除策略做的事,redis有三种删除策略。

时效性数据的存储结构
Redis删除策略
expires空间相当于是redis开辟的一个存放值的地址和对应过期时间的空间,删除策略相当于是维护下面这个空间中的东西,上面存的值不变。

删除策略的目标
在内存和cpu占用之间找到一个平衡,顾此失彼会造成整个redis的性能下降,甚至引发服务器宕机或者内存泄露。
就是在cpu闲的时候把那些过期的数据删除,忙的时候就不占用cpu了。

1、定时删除

  • 创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器立即执行对key的删除。
  • Redis删除策略
    到点了就干掉expires中和上面的key值。用处理器性能换内存空间。

优点:

  • 节约内存,到点了就立即释放掉不必要的内存空间。

缺点

  • cpu的压力会很大,不会考虑删除的时候cpu是否空闲,会影响redis服务器的响应时间和吞吐量。

2、惰性删除

  • 数据到达过期时间,不做处理。等下次访问该数据时,发现未过期,则返回值;发现已经过期,删除(删除expires空间和key值),并返回不存在。

优点

  • 节约cpu性能,当数据必须删除的时候才删除。

缺点

  • 内存压力很大,出现过期数据会长期占用内存的情况。

其实就是拿内存换cpu性能。

3、定期删除

上面的两种方案都比较极端,要么牺牲空间,要么牺牲时间。有没有这种的方案?

Redis删除策略

Redis删除策略

  • 周期性轮询redis库中的时效性数据,采用随机抽取策略,利用过期数据占比的方式控制删除的频度。

特点
1、CPU性能占用设置了峰值,检测频度可以自己配置。
2、内存压力不是很大,长期占用内存的冷数据会被持续清理。

总结:周期性抽查存储空间(随机抽查,重点抽查)。
redis内部用的是惰性删除和定期删除。

逐出算法

新数据进入redis时,如果内存不足怎么办?

redis使用内存存储数据,在执行每一条命令前,会调用freeMemoryIfNeeded()检测内存是否充足,如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。
注意
逐出数据的过程不是100%能成功,如果执行一次后内存任然无法到达要求,会再次执行,如果对所有数据尝试完毕后,还是不是达到内存的要求,会爆出错误。

Redis删除策略

影响数据逐出的相关配置

Redis删除策略
Redis删除策略

数据逐出策略配置依据

  • 使用info命令输出监控信息,查询缓存hit和miss的次数,根据业务需求调优Redis配置。
    Redis删除策略