Redis:过期策略

一、主节点的过期策略

    Redis有两种策略来删除过期的key,定时扫描删除策略和惰性删除策略。

1、惰性删除策略

    惰性策略指的是,在客户端访问这个key的时候,对key的过期时间进行检测,如果过期就立即删除。这是一种零散处理。

2、定时扫描策略

    Redis将设置了过期时间的key放到一个集合中,然后会定时扫描集合删除到期的key。Redis默认每秒进行10次过期扫描,过期扫描不会遍历过期字典的所有的key,而是采用贪心策略:

  1. 从过期字典随机选出20个key;
  2. 删除这20个key中已经过期的key;
  3. 如果扫描时间达到了扫描时间上限(默认25ms),就终止本次扫描;
  4. 如果过期的key的比例超过了1/4,就重复步骤1;否则,终止本次扫描。

2.1 定时扫描策略的问题

1、卡顿问题:

    如果Redis中大量的key同一时间过期了,会导致严重的卡顿问题:

  1. Redis定时扫描过期字典时,循环次数会明显升高,消耗的时间明显增加。由于Redis是单线程的,所以会延迟处理扫描期间接入的客户端请求;
  2. 由于大量内存被回收,内存管理器会频繁回收内存页,也会产生一定的CPU消耗,影响性能。

2、难定位的慢查询:

    需要注意的是,Redis定时扫描导致的请求变慢,无法从Redis的slowlog中查看到慢查询记录,因为slowlog记录的是逻辑处理过程慢的请求,而不包含等待时间。

    所以使用者需要注意,如果有大批量的key过期,要给过期时间设置一个随机值,而不能全部在同一时间过期。

二、从节点的过期策略

    从节点不会自主对过期的key进行处理。主节点在key到期时,会在AOF文件中增加一条del指令,同步到所有的从节点,从节点通过执行这条del指令来删除过期的key。

    由于指令同步是异步进行的,所以主从节点对过期的key的处理,不是强一致性的,在同步期间会产生数据不一致的问题。

你可能感兴趣的:(redis)