Redis-Key的过期策略

key的过期策略

主动过期

为key设置expire。由于redis是单线程的如果对于过期的key扫描的过多会影响服务的卡顿,所以redis提供了惰性过期和主动扫描过期俩种方案。

扫描机制,redis会把设置过期时间的key放在内存中,key的扫描过期机制如下:

  1. 为了防止频繁扫描,redis每秒扫描10次过期的key,明且每次扫描建个是25ms
  2. 每次扫描随机取20个key
  3. 判断20个key是否过期,并且回收过期key
  4. 如果过期的key占1/4会重复回收

    如果这段时间有大量的key过期,势必会增加扫描频次,同时由于redis的内存管理对数据页的回收,会导致CPU飙升,服务卡顿。

    注意:salve没有扫描机制,master过期后会生成一条del的命令给slave执行(如果这时候宕机可能造成数据不一致)。

LRU

redis本质是内存数据库当内存占用满后,根据maxmemory-policy配置,会有如下几种策略

  • noeviction:默认策略,直接拒绝写服务(del后会执行),不会丢失数据
  • volatile-lru:对设置expire的key进行淘汰。策略是lru
  • volatile-ttl:对设置expire的key进行淘汰。策略是ttl
  • volatile-random:对设置expire的key进行淘汰。策略是随机
  • allkeys-lru:对所有的key进行淘汰。策略是lru
  • allkeys-random:对所有的key进行淘汰。策略是随机

    redis为了节省内存采用了近似lru算法的淘汰机制,是一种懒惰淘汰机制,即当写入操作发现内存已经超过了maxmemory时候,根据maxmemory-policy去allkeys和设置了过期时间的keys中随机取5个key淘汰掉最旧的key。

异步线程

懒惰删除

redis如果删除一个key正好这个key是大key,会阻碍业务的执行。redis4.0增加了unlink命令可以将key放到异步队列中由异步线程去消费。

AOF的异步刷盘

由于AOF需要调用sync,会影响业务。所以AOF的刷盘也会放到一个异步队列和线程中。为了保证效率是独立的一个线程处理