1. 内存分配


  • 不同数据类型的大小限制
    • Strings 类型:一个 String 类型的 value 最大可以存储 512M。
    • Lists 类型:list 的元素个数最多为 2^32-1 个,也就是 4294967295 个。
    • Sets 类型:元素个数最多为 2^32-1 个,也就是 4294967295 个。
    • Hashes 类型:键值对个数最多为 2^32-1 个,也就是 4294967295 个。
  • 最大内存控制
    1. maxmemory 最大内存阈值
    2. maxmemory-policy 到达阈值的执行策略

2. 内存压缩


# 配置字段最多 512 个
hash-max-zipmap-entries 512
# 配置 value 最大为 64 字节
hash-max-zipmap-value 64
# 配置元素个数最多 512 个
list-max-ziplist-entries 512
# 配置 value 最大为 64 字节
list-max-ziplist-value 64
# 配置元素个数最多 512 个
set-max-intset-entries 512
# 配置元素个数最多 128 个
zset-max-ziplist-entries 128
# 配置 value 最大为 64 字节
zset-max-ziplist-value 64
  • 大小超出压缩范围,溢出后 Redis 将自动将其转换为正常大小。

3. 过期数据的处理策略


  • 主动处理(redis 主动触发检测 key 是否过期)每秒执行 10 次。过程如下:
    • 从具有相关过期的密钥中测试 20 个随机密钥。
    • 删除找到的所有密钥已过期。
    • 如果超过 25% 的密钥已过期,请从步骤 1 重新开始。
  • 被动处理
    • 每次访问 key 的时候,发现超时后被动过期,清理掉。

4. 数据恢复阶段过期数据的处理策略


  • RDB 方式
    • 过期的 key 不会被持久化到文件中。
    • 载入时过期的 key,会通过 redis 的主动和被动方式清理掉。
  • AOF 方式
    • 当 redis 使用 AOF 方式持久化时,每次遇到过期的 key redis 会追加一条 DEL 命令到 AOF 文件,也就是说只要我们顺序载入执行 AOF 命令文件就会删除过期的键。

注意:过期数据的计算和计算机本身的时间是有直接联系的!

5. Redis 内存回收策略


  • 配置文件中设置:maxmemory-policy noeviction
  • 动态调整:config set maxmemory-policy noeviction | 回收策略 | 说明 | | —- | —- | | noeviction | 客户端尝试执行会让更多内存被使用的命令直接报错 | | allkeys-lru | 在所有 key 里执行 LRU 算法 | | volatile-lru | 在所有已经过期的 key 里执行 LRU 算法 | | allkeys-lfu | 使用近似 LFU 逐出任何键 | | volatile-lfu | 使用过期集在密钥中使用近似 LFU 进行驱逐 | | allkeys-random | 在所有 key 里随机回收 | | volatile-random | 在已经过期的 key 里随机回收 | | volatile-ttl | 回收已经过期的 key,并且优先回收存活时间(TTL)较短的键 |

LRU 算法

  • LRU(Least recently used,最近最少使用):根据数据的历史访问记录来进行淘汰数据。
  • 核心思想:如果数据最近被访问过,那么将来被访问的几率也很高。
  • 注意:Redis 的 LRU 算法并非完整的实现,完整的 LRU 实现是因为这需要太多的内存。
  • 方法:通过对少量 keys 进行取样(50%),然后回收其中一个最好的 key。
  • 配置方式:maxmemory-samples 5

LFU 算法

  • LFU(Least Frequently Used)根据数据的历史访问频率来淘汰数据。
  • 核心思想:如果数据过去被访问多次,那么将来被访问的频率也更高。
  • Redis 实现的是近似的实现,每次对 key 进行访问时,用基于概率的对数计数器来记录访问次数,同时这个计数器会随着时间推移而减小。
  • Morris counter 算法依据:https://en.wikipedia.org/wiki/Approximate_counting_algorithm
  • 启用 LFU 算法后,可以使用热点数据分析功能。(redis-cli —hotkeys)