Redis 学习笔记(六)-- 理解内存

Redis 的所有数据都存在内存中,因此如何高效利用Redis内存十分重要。

内存消耗

  • 内存使用统计(通过info memory 命令获取内存相关指标)
    • used_memory 内部存储的所有数据内存占用量
    • used_memory_rss 从操作系统角度显示Redis 进程占用内存量
    • mem_fragmentation_ratio used_memory_rss/used_memory 比值,表示内存碎片率
  • 内存消耗划分(自身内存+对象内存+缓冲内存+内存碎片)
    Redis 学习笔记(六)-- 理解内存
    • 对象内存
      对象内存是Redis 内存占用最大的一块,存储着用户所有的数据。Redis所有的数据都采用key-value数据类型,哪次创建键值对是,至少创建两个类型对象:key对象和value对象。对象内存消耗可以简单理解为sizeof (keys) + sizeof (values)
    • 缓冲内存
      • 客户端缓冲
      • 复制积压缓冲区
      • AOF 缓冲区
    • 内存碎片
      • 导致原因:频繁做更新操作、大量过期键删除等
      • 解决方案:数据对齐、安全重启等
  • 子进程内存消耗
    子进程内存消耗主要指执行 RDB快照、AOF重写时Redis创建子进程的内存消耗。

内存管理

  • 控制内存上线
    • Redis 使用 maxmemory 限制最大可用内存。需要注意的是 maxmemory 限制的是Redis 的实际使用内存量,也就是used_memory 项对应的内存。
    • Redis 的内存上限可以通过 config set maxmemory 动态修改
  • 内存回收策略
    • 删除到达过期时间的键对象
      • 惰性删除
      • 定时任务删除
    • 内存使用达到 maxmemory 上限是内存溢出控制策略
      • maxmemory-policy 参数控制,redis支持6种策略(默认策略为noeviction,不会删除数据,拒绝写入)。

内存优化

  • redisObject 对象
    Redis 存储的所有值对象在内部定义为redisObject 结构体。内部结构如下图
    Redis 学习笔记(六)-- 理解内存
  • 缩减键值对象(缩减键(key)和值(value)的长度)
  • 字符串优化
    字符串结构体如下图所示
    Redis 学习笔记(六)-- 理解内存
  • 编码优化
  • 控制键的数量