返回

从根儿上理解 Redis 内存淘汰策略,寻根求源再辨真相

后端

前言

Redis作为基于内存设计的数据库,其数据存储在内存中。随着时间的推移,内存占用不断增加,迫使我们在内存使用达到一定程度后采取清理措施,以保证系统正常运转。

Redis 内存淘汰策略总览

Redis内存淘汰策略共分为六种,分别为:

  1. volatile-lru :按照LRU(最近最少使用)算法,淘汰设置了过期时间的key。
  2. allkeys-lru :按照LRU算法,淘汰所有key,无论是否设置了过期时间。
  3. volatile-lfu :按照LFU(最不经常使用)算法,淘汰设置了过期时间的key。
  4. allkeys-lfu :按照LFU算法,淘汰所有key,无论是否设置了过期时间。
  5. volatile-ttl :按照key的过期时间,淘汰设置了过期时间的key。过期时间越短,淘汰优先级越高。
  6. no-eviction :不淘汰任何key,Redis会一直运行下去,直至内存耗尽。

Redis 内存淘汰策略原理及算法剖析

LRU算法

LRU(最近最少使用)算法是一种淘汰策略,淘汰最长时间未被使用的key。

LRU算法的核心数据结构是一个队列,队列中保存了所有key,队列的头部是最近最少使用的key,队列的尾部是最久未被使用的key。当需要淘汰一个key时,LRU算法会淘汰队列头部的key。

LFU算法

LFU(最不经常使用)算法是一种淘汰策略,淘汰最不经常使用的key。

LFU算法的核心数据结构是一个哈希表,哈希表中保存了所有key及其使用计数。当需要淘汰一个key时,LFU算法会淘汰使用计数最少的key。

TTL算法

TTL(过期时间)算法是一种淘汰策略,淘汰过期时间最短的key。

TTL算法的核心数据结构是一个优先级队列,优先级队列中保存了所有设置了过期时间的key,队列的头部是过期时间最短的key,队列的尾部是过期时间最长的key。当需要淘汰一个key时,TTL算法会淘汰队列头部的key。

Redis 内存淘汰策略比较

淘汰策略 淘汰条件 淘汰方式 复杂度
volatile-lru 设置了过期时间的key 最近最少使用 O(1)
allkeys-lru 所有key 最近最少使用 O(n)
volatile-lfu 设置了过期时间的key 最不经常使用 O(1)
allkeys-lfu 所有key 最不经常使用 O(n)
volatile-ttl 设置了过期时间的key 过期时间最短 O(log n)
no-eviction

结语

本文深入探讨了Redis内存淘汰策略,全面剖析了LRU、LFU等淘汰算法,并揭示了其背后的原理和运作机制,为优化Redis内存管理提供理论支持和实践指导。在实际应用中,我们可以根据不同的业务场景和需求,选择合适的Redis内存淘汰策略,以保证Redis的稳定运行和高效性能。