Redis 的所有数据都存在内存中,因此如何高效利用Redis内存十分重要。
内存消耗
- 内存使用统计(通过
info memory
命令获取内存相关指标)used_memory
内部存储的所有数据内存占用量used_memory_rss
从操作系统角度显示Redis 进程占用内存量mem_fragmentation_ratio
used_memory_rss/used_memory 比值,表示内存碎片率
- 内存消耗划分(自身内存+对象内存+缓冲内存+内存碎片)
- 对象内存
对象内存是Redis 内存占用最大的一块,存储着用户所有的数据。Redis所有的数据都采用key-value数据类型,哪次创建键值对是,至少创建两个类型对象:key对象和value对象。对象内存消耗可以简单理解为sizeof (keys) + sizeof (values) - 缓冲内存
- 客户端缓冲
- 复制积压缓冲区
- AOF 缓冲区
- 内存碎片
- 导致原因:频繁做更新操作、大量过期键删除等
- 解决方案:数据对齐、安全重启等
- 对象内存
- 子进程内存消耗
子进程内存消耗主要指执行 RDB快照、AOF重写时Redis创建子进程的内存消耗。
内存管理
- 控制内存上线
- Redis 使用 maxmemory 限制最大可用内存。需要注意的是 maxmemory 限制的是Redis 的实际使用内存量,也就是
used_memory
项对应的内存。 - Redis 的内存上限可以通过
config set maxmemory
动态修改
- Redis 使用 maxmemory 限制最大可用内存。需要注意的是 maxmemory 限制的是Redis 的实际使用内存量,也就是
- 内存回收策略
- 删除到达过期时间的键对象
- 惰性删除
- 定时任务删除
- 内存使用达到 maxmemory 上限是内存溢出控制策略
- 由
maxmemory-policy
参数控制,redis支持6种策略(默认策略为noeviction
,不会删除数据,拒绝写入)。
- 由
- 删除到达过期时间的键对象
内存优化
- redisObject 对象
Redis 存储的所有值对象在内部定义为redisObject 结构体。内部结构如下图
- 缩减键值对象(缩减键(key)和值(value)的长度)
- 字符串优化
字符串结构体如下图所示
- 编码优化
- 控制键的数量