redis过期策略和淘汰机制

过期时间

  1. 设置过期时间:通过EXPIRE key seconds命令来设置数据的过期时间,返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间
    • 在key上设置了过期时间后key将在指定的秒数后被自动删除
    • 被指定了过期时间的key在Redis中被称为是不稳定的
    • 执行DEL命令删除或者SET、GETSET命令重置后与之关联的过期时间会被清除
    • 使用PERSIST可以清除过期时间

过期策略

  1. 定时删除

    • 含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除
    • 优点:保证内存被尽快释放
    • 缺点:
      • 若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key
      • 定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重
  2. 惰性删除

    • 含义:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期则删除并返回null。
    • 优点:删除操作只发生在取出key的时候,而且只删除当前key,对CPU时间的占用是比较少的
    • 缺点:若大量的key在超出超时时间后,很久一段时间内都没有被获取过,那么可能发生内存泄露
  3. 定期删除

    • 含义:每隔一段时间执行一次删除(在redis.conf配置文件设置hz,1s刷新的频率)过期key操作
    • 优点:
      • 通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用–处理”定时删除”的缺点
      • 定期删除过期key–处理”惰性删除”的缺点
    • 缺点
      • 在内存友好方面,不如”定时删除”
      • 在CPU时间友好方面,不如”惰性删除”

总结

  • 定时删除和定期删除为主动删除:Redis会定期主动淘汰一批已过去的key
  • 惰性删除为被动删除:用到的时候才会去检验key是不是已过期,过期就删除
  • 惰性删除+定期删除为redis服务器内置策略
    • 第一、配置redis.conf 的hz选项,默认为10 (即1秒执行10次,100ms一次,值越大说明刷新频率越快,最Redis性能损耗也越大)
    • 第二、配置redis.conf的maxmemory最大值,当已用内存超过maxmemory限定时就会触发主动清理策略

淘汰机制(主动清理策略)

  1. noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息
    • 大多数写命令都会导致占用更多的内存(有极少数会例外, 如DEL)
    • 默认的策略
  2. allkeys-lru: 所有key通用
    • 优先删除最近最少使用(less recently used,LRU)的 key。
  3. volatile-lru: 只限于设置了 expire 的部分
    • 优先删除最近最少使用(less recently used,LRU)的 key。
  4. allkeys-random: 所有key通用
    • 随机删除一部分 key。
  5. volatile-random: 只限于设置了 expire 的部分
    • 随机删除一部分 key。
  6. volatile-ttl: 只限于设置了 expire 的部分
    • 优先删除剩余时间(time to live,TTL) 短的key。