淘汰策略

  • 针对所有key
    • noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。
    • allkeys-lru: 优先删除最近最少使用(less recently used ,LRU) 的 key。
    • allkeys-random: 所有key通用; 随机删除一部分 key。
    • : 所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。
  • 针对已过期key
    • volatile-lru: 优先删除最近最少使用(less recently used ,LRU) 的 key。
      • lru算法中,redis根据过期时间和当前时间戳的差值维护了一个优先队列,淘汰时会从中淘汰最高优先的数据。
      • 为了减少单次访问后导致热缓存被淘汰,优化出了lru-k的算法,也就是被使用到k次才加入lru缓存队列,这个和mysql的buffer-pool的缓存失效机制是相似的。
    • volatile-random: 只限于设置了 expire 的部分; 随机删除一部分 key。
    • volatile-ttl: 只限于设置了 expire 的部分; 优先删除剩余时间(time to live,TTL) 短的key。

清理时机

内存利用率和性能的一个平衡

  • 同步淘汰:为每一个设置了过期时间的key绑定一个轮询器,不断轮询过期情况。降低redis吞吐量。
  • 定时淘汰:定时捞取一批设置了过期时间的key,遍历过期情况然后淘汰。未被捞取期间存在内存浪费,如果用用户线程会降低redis吞吐量。
  • 延迟淘汰:在使用到key的时候,计算key的过期情况,如果过期这进行淘汰且返回空。将过期情况的计算分散到每次用户线程上,性能最佳,但是存在内存浪费,甚至是永久内存浪费(不再访问)。