Redis数据过期策略

Redis中Key的过期时间

通过EXPIRE key seconds命令来设置数据的过期时间。返回1表明设置成功,返回0表明key不存在或者不能成功设置。在key上设置了过期时间后key将在指定的秒数后被自动删除。指定过期时间的key在Redis中是不稳定的。

Redis过期键删除策略

Redis key过期的方式有三种:

被动删除

当key被操作时(例如get),redis才会被动检查该key是否过期,如果过期则删除之并且返回NIL。这种方式显然会造成大量的内存空间浪费。

主动删除

Redis中,有个常规操作serverCron,它主要执行以下操作:

Redis将serverCron作为时间事件来循环运行,直到服务器关闭为止。默认情况下每秒运行10次,2.8版本之后,可以修改redis.conf中hz参数进行调整,一般建议不超过100。 除了hz主动淘汰的频率外,Redis对每次淘汰任务执行的最大时长也有一个限定timelimit,这样保证了每次主动淘汰不会过多阻塞应用请求。它们是倒数的关系,也就是说hz配置越大,timelimit就越小。

当hz为10时,Redis每秒做10次如下的步骤:

  1. 随机测试100个设置了过期时间的key
  2. 删除所有发现的已过期的key
  3. 若删除的key超过25个则重复步骤1

需要注意的是,在主从模式下,只有master节点才会执行上述这两种过期删除策略,然后把删除操作del key同步到slave结点。

超过maxmemory

当前已用内存超过maxmemory限定时,触发主动清理策略,主要包含以下几种(可通过maxmemory-policy指定):

清理时会根据配置的maxmemory-policy来做适当的清理(一般是LRU或TTL),并不是针对redis的所有key,而是以配置文件中的maxmemory-samples个key作为样本池进行抽样清理。 maxmemory-samples默认配置为5,如果增加(一般不要超过10),会提高LRU或TTL的精准度,但会消耗更多的CPU。

尽量不要触发maxmemory,最好在mem_used内存占用达到maxmemory的一定比例后,需要考虑调大hz以加快淘汰,或者进行集群扩容。