Redis 内存模型

了解 Redis 的 5 种对象类型(字符串、哈希、列表、集合、有序集合)的用法和特点的基础,了解 Redis 的内存模型,对 Redis 的使用有很大帮助,例如:

  • 估算 Redis 内存使用量。内存的使用成本相对较高,使用内存不能无所顾忌;根据需求合理的评估 Redis 的内存使用量,选择合适的机器配置,可以在满足需求的情况下节约成本。
  • 优化内存占用。了解 Redis 内存模型可以选择更合适的数据类型和编码,更好的利用 Redis 内存。
  • 分析解决问题。当 Redis 出现阻塞、内存占用等问题时,尽快发现导致问题的原因,便于分析解决问题。

Redis 内存统计

在客户端通过 redis-cli 连接服务器后,通过 info 命令可以查看服务器基本信息、CPU、内存、持久化、客户端连接信息等等;

Memory 是参数,查看内存相关的信息:info memory。

used_memory

Redis 分配器分配的内存总量(单位是字节),包括使用的虚拟内存(即 swap);used_memory_human 显示更友好。

used_memory_rss

Redis 进程占据操作系统的内存(单位是字节),与 top 及 ps 命令看到的值是一致的。

除了分配器分配的内存之外,used_memory_rss 还包括进程运行本身需要的内存、内存碎片等,但是不包括虚拟内存

used_memory 和 used_memory_rss,前者是从 Redis 角度得到的量,后者是从操作系统角度得到的量。

二者之所以有所不同,一方面是因为内存碎片和 Redis 进程运行需要占用内存,使得前者可能比后者小,另一方面虚拟内存的存在,使得前者可能比后者大。

由于在实际应用中,Redis 的数据量会比较大,此时进程运行占用的内存与 Redis 数据量和内存碎片相比,都会小得多。

因此 used_memory_rss 和 used_memory 的比例,便成了衡量 Redis 内存碎片率的参数;这个参数就是 mem_fragmentation_ratio。

mem_fragmentation_ratio

内存碎片比率,该值是 used_memory_rss / used_memory 的比值。

mem_fragmentation_ratio 一般大于 1,且该值越大,内存碎片比例越大mem_fragmentation_ratio<1,说明 Redis 使用了虚拟内存,由于虚拟内存的媒介是磁盘,比内存速度要慢很多。

当这种情况出现时,应该及时排查,如果内存不足应该及时处理,如增加 Redis 节点、增加 Redis 服务器的内存、优化应用等。

一般来说,mem_fragmentation_ratio 在 1.03 左右是比较健康的状态(对于 jemalloc 来说)。

当还没有向 Redis 中存入数据时 mem_fragmentation_ratio 值相对较大,因为Redis 进程本身运行的内存使得 used_memory_rss 比 used_memory 大得多。

mem_allocator

Redis 使用的内存分配器,在编译时指定;可以是 libc 、jemalloc 或者 tcmalloc,默认是 jemalloc。

Redis 内存划分

猜你喜欢

转载自www.cnblogs.com/wade-luffy/p/9638910.html