跳到主要内容

内存

2025年02月23日
柏拉文
越努力,越幸运

一、认识


二、内存分析


Redis 通过 info memory 可以查看 内存 使用情况

  1. used_memory: Redis 分配器分配的内存量, 也就是实际存储数据的内存总量。 used_memory 包括:

    • 自身内存: 800k 左右

    • 对象内存: keyValuekey 不要过长, 数据量大的情况下, 不容忽视。 value 通过 ziplistintset 等优化方式

    • 缓冲内存: 包括 客户端缓冲区复制缓冲区AOF 缓冲区客户端缓冲区: 可以通过 client list 命令查看。包括 普通客户端缓冲区 normalSlave 客户端缓冲区 slave, 从节点用于复制, 伪装成客户端、PubSub 客户端缓冲区 pubsub。对应的配置为 client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>, 其中, class 表示 客户端类型;hard limit 表示如果客户端使用的输出缓冲区大于 hard limit,客户端会被立即关闭; soft limitsoft seconds 表示如果客户端使用的输出缓冲区超过了 soft limit 并且持续了 soft seconds 秒, 客户端会被立即关闭。普通客户端缓冲区 normal 默认配置为: client-output-buffer-limit normal 0 0 0; Slave 客户端缓冲区 slave 默认配置为 client-output-buffer-limit slave 256mb 64mb 60, 当主从延迟较高, 或者从节点过多, 可能会超过 limit 限制, 所以可以适当设置的大一些, 防止客户端被关闭。PubSub 客户端缓冲区 pubsub 默认配置为 client-output-buffer-limit pubsub 32mb 8mb 60

    • Lua 内存

  2. used_memory_rss: 从操作系统的角度, Redis 进程占用的总物理内存

  3. mem_fragmentation_ratio: use_memory_rss / used_memory 比值, 表示内存碎片率

  4. use_memory-rss - use_memory: 内存碎片

三、内存回收


3.1 删除过期键值

删除过期键值 Redis 不保证精确的到期时间,因为过期键的删除是由后台线程或访问触发的。Redis 使用 惰性删除定期删除 机制处理过期键。惰性删除:只有当过期键被访问时才会检查并删除。定期删除Redis 会定期扫描一部分键来删除已过期的键。

3.2 内存溢出控制策略

Redis 使用的内存超过 maxmemory 后会触发相应策略, 由 maxmemory-policy 控制。策略如下:

  1. Noeviction, 默认策略, 不会删除任何数据, 拒绝所有写入操作并返回端错误信息

  2. Volatile-lru: 根据 LRU 算法删除设置了超时属性 Expire 的键, 直到腾出足够的空间为止。如果没有可删除的键对象, 回退到 noeviction 策略。

  3. Allkeys-lru: 根据 LRU 算法删除键, 不管数据有没有设置超时属性, 直到腾出足够空间为止。

  4. Allkeys-random: 随机删除所有键, 直到腾出足够空间为止。

  5. volatile-random: 随机删除过期键, 直到腾出足够空间为止。

  6. volatile-ttl: 根据键值对象的 ttl 属性, 删除最近将要过期数据。如果没有,回退到 noeviction 策略。