• Redis的过期策略有哪些?
  • 发布于 1个月前
  • 65 热度
    0 评论
Redis过期策略有以下几种,总结如下:
一 定时删除
定时删除策略是,在设置 key 的过期时间时,同时创建一个定时事件,当时间到达时,由事件处理器自动执行 key 的删除操作。好处是,可以保证过期 key 会被尽快删除,也就是内存可以被尽快地释放。

不好的地方在于,在过期 key 比较多的情况下,删除过期 key 会占用相当一部分 CPU 时间,在内存不紧张但 CPU 时间紧张的情况下,将 CPU 时间用于删除和当前任务无关的过期键上,会对服务器的响应时间和吞吐量造成影响

二 惰性删除
惰性删除是一种被动的删除方式,在这种情况下,它不主动删除过期键,当时,当每次从数据库访问 key 时,都会去检测 key 是否过期,如果过期则删除该 key。它的好处是,因为是在每次访问时,才会检查 key 是否过期,所以此策略只会使用很少的系统,节约CPU资源。

不好的地方在于,如果一个 key 已经过期,而这个 key 没有被删除,只要这个过期 key 一直没有被访问,它所占用的内存就不会释放,造成了一定的内存空间浪费。


三 定时删除
定时删除是一种主动的删除方式,在这种情况下,它每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。它的好处是,通过限制删除操作执行的时长和频率,来减少删除操作对 CPU 的影响,同时也能删除一部分过期的数据减少了过期键对空间的无效占用。

不好的地方在于,内存清理方面没有定时删除效果好,同时没有惰性删除使用的系统资源少。而且比较难以确定删除操作执行的时长和频率。如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好;如果执行的太少,那又和惰性删除一样了,过期 key 占用的内存不会及时得到释放。

在Redis里面,在 Redis 中,默认每秒进行 10 次过期检查一次数据库,此配置可通过 Redis 的配置文件redis.conf 进行配置,配置键为 hz 它的默认值是 hz 10。然后随机抽查的数量是20,常量ACTIVE_EXPIRE_CYCLE_KEYS_PER_LOOP是写死在配置里面的(在 expire.c 文件下的 activeExpireCycle 函数中),如下图:

四  实际使用方式
Redis使用的删除策略是惰性删除+定期删除。只采用定期删除策略,由于是随机的且一次数量只有20个,会导致很多key到时间没有删除。这个时候,惰性删除派上用场。在获取某个key的时候,会检查是否过期,若过期则删除。

存在的问题:如果定期删除没删除key。然后也没有即时去请求key(也就是说惰性删除也没生效)。如果出现这样的情况,就会导致Redis的内存会越来越高。
用户评论