Redis的过期删除策略

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis的过期删除策略相关的知识,希望对你有一定的参考价值。

参考技术A Redis只能存5G数据,可是你 写了10G,那会删5G的数据。怎么删的?

数据已经设置了过期时间,但是时间到了,内存占用率还是比较高,为什么?

定期删除+惰性删除策略

定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在 大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略

定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是 每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡 死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。 于是,惰性删除派上用场。也就是说在你 获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。 采用定期删除+惰性删除就没其他问题了么? 不是的,如果定期删除没删除key。然后你也没即时去请求key, 也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。

Redis Key过期淘汰策略

一、Redis key过期策略

Redis会将每个设置了过期时间的key放入到一个独立的字典中,以后会定时遍历这个字典来删除过期的key;
除了定时遍历之外,它还会使用惰性策略来删除过期的key,所谓惰性策略就是在客户端访问这个key时,redis对key的过期时间进行检查,如果过期了就立即删除,定时删除是集中处理,惰性删除是零散处理;

1、定时扫描删除
  1. Redis配置项hz定义了serverCron任务的执行周期,默认为10,即CPU空闲时每秒执行10次;
  2. 从过期字典中随机选20个key,删除这20个key中已经过期的key,再拿20个key,检查过期的key比率超过1/4,那就重复步骤1;
  3. 每次过期key清理的时间不超过CPU时间的25%,即若hz=1,则一次清理时间最大为250ms,若hz=10,则一次清理时间最大为25ms;
  4. 从库的过期策略:从库不会进行过期扫描,从库对过期的处理时被动的,主库在key到期是,会在AOF文件里增加一条del指令,同步到所有从库,从库通过执行这条del指令来删除过期的key。
2、惰性删除策略

在生产环境中为了限制redis实例最大使用内存,redis提供了配置参数maxmemory来限制内存超出,在实际内存超出maxmemory时,redis提供了几种可选策略(maxmemory-policy)供用户选择:

  • noeviction 不会继续服务写请求(DEL请求可以继续服务),读请求可以继续进行,这样可以保证数据不丢失,但是会让线上业务不能持续进行,这是默认的淘汰策略;
  • volatile-lru 尝试淘汰设置了过期时间的key中使用频率最低的key,没有设置过期时间的key不会被淘汰,这样可以保证需要持久化的数据不会丢失;
  • volatile-ttl 尝试淘汰设置了过期时间的key中ttl值最小的key;
  • volatile-random 随机淘汰设置了过期时间的key;
  • allkeys-lru 区别于volatile-lru 这个策略要淘汰的key对象是全体的key集合;
  • allkeys-random 随机淘汰redis实例中所有key。

以上是关于Redis的过期删除策略的主要内容,如果未能解决你的问题,请参考以下文章

Redis过期删除策略和内存淘汰策略

Redis(过期策略)

Redis 过期策略 和 回收策略

Redis过期策略

Redis过期键删除策略及回收策略

Redis过期键删除策略及原理