文章目录

  • 前言
  • 定期删除 and 惰性删除
  • Reids内存淘汰策略
  • 总结



前言

假如在Redis中,我们设置了10W个key,这些key的过期时间为2个小时,那么在过期时间结束之后,这些key是怎么被删除的?

定期删除 and 惰性删除

定期删除: Reids默认每间隔100ms随机抽取一些key,检查是否有过期的key,有过期的key则删除,需要注意的是Redis不是每间隔100ms就将所有的key检查一次,而是从中随机抽取一些key来检查是否过期,如果每间隔100ms就将所有的key检查一遍,那么会给CPU带来很大的负载(key很多的情况下),Redis极有可能卡死,综上,如果只采用定期删除策略,会导致很多key到过期时间还未被删除。

惰性删除: 通过了解定期删除,我们发现定期删除策略可能会导致很多过期的key到了过期时间也还没有被删除,为了解决这个问题,redis增加了惰性删除策略,对于那些过期的key,依靠定期删除没有被删除掉,还保留在内存中,这时候如果系统主动去查询这个key,redis判断已经过期了,才会把这个key删除掉。

但是只靠这两种策略就可以清除redis的key了吗?
仅仅靠通过设置过期时间还是存在着问题的。由于定期删除策略是随机抽取的,因此很有可能漏掉很多过期的key,这时候我们也没有主动去查询这些过期的key,因此也就没有使用惰性删除策略了,这时候如果有大量的过期key堆积,会导致内存被消耗完。要解决这个问题:可以使用 redis 内存淘汰机制

Reids内存淘汰策略

1、noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
2、allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个比较常用)
3、allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
4、volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
5、volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
6、volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

总结

仅仅依靠定期删除和惰性删除也是无法满足redis正常清除的,还是会有大量的key堆积,需要结合内存淘汰策略来理解。