Redis学习目录总结01-Redis内存解读

198 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

前言

Redis是目前各个大厂使用最频繁的中间件,在内存中进行数据读写,相比于传统的关系型数据库比较,大大提高了数据读写速度,特别适合高并发场景。

我们使用Redis时,会用到Redis的5种对象类型-字符串、哈希、列表、集合、有序集合。在了解Redis的5种对象类型的用法和特点的基础之上,进一步深入了解Redis的内存模型,对Redis的使用会有很大帮助。

今天一起了解下Redis的基本信息还有内存模型:

通过info命令可以查询Redis的状态。其中包含:Server、Clients、Memory、Persistence、Stats、Replication、CPU、Cluster、Keyspace。我们今天主要学习Redis的内存模型,所以首先了解下memory的组成:

memory内存

image.png

image.png

used_memory: Redis 分配器分配的内存总量-(byte)单位
used_memory_human:Redis 分配的内存总量-简单理解为文字叙述
used_memory_rss:返回 Redis 已分配的内存总量-系统叙述
used_memory_peak:Redis内存消耗峰值(byte)单位 
used_memory_peak_human:Redis 的内存消耗峰值-简单理解为文字叙述
used_memory_peak_perc:使用内存占峰值内存的百分比
used_memory_overhead:服务器为管理其内部数据结构而分配的所有开销的总和(byte)单位
used_memory_startup:Redis在启动时消耗的初始内存大小-(byte)单位
used_memory_dataset:数据集大小[used_memory减used_memory_overhead]-(byte)单位
used_memory_dataset_perc:used_memory_dataset占净内存使用量的百分比[used_memory减used_memory_startup]
total_system_memory:Redis主机具有的内存总量
total_system_memory_human:Redis主机具有的内存总量-简单理解为文字叙述
used_memory_lua	Lua:引擎所使用的内存大小-(byte)单位
used_memory_lua_human:Lua 引擎所使用的内存大小-简单理解为文字叙述
maxmemory:maxmemory配置指令的值 

挑出比较重要的几个说明:

  • used_memory Redis分配器分配的内存总量(byte单位),其中包括使用的虚拟内存used_memory_human仅仅是为了更友好的显示。

  • used_memory_rss rss是Resident Set Size的缩写,表示该进程所占物理内存的大小,是操作系统分配给Redis实例的内存大小(byte单位),值得注意的是,除了分配器分配的内存之外,used_memory_rss还包括进程运行本身需要的内存、内存碎片等,但是不包括虚拟内存

used_memory和used_memory_rss有什么区别呢?

  • used_memory是从Redis角度得到的量。
  • used_memory_rss从操作系统角度得到的量。
  • 因为内存碎片和Redis进程运行需要占用内存,而且used_memory_rss包含虚拟内存,所以used_memory会比used_memory_rss小。

Redis的进程运行占用的内存与Redis数据量和内存碎片相比小得多,所以used_memory_rss和used_memory的比例,就成为了衡量Redis内存碎片率的参数:mem_fragmentation_ratio。

  • mem_fragmentation_ratio 内存碎片比率,used_memory_rss / used_memory的比值。

  • mem_fragmentation_ratio一般情况下大于1,该值越大,代表内存碎片比例越大。网上很多资料说正常范围在1-1.5之间,如果超过1.5说明Redis占用实际需要物理内存的150%以上,其中50%是内存碎片率,可能是操作系统或Redis实例中内存管理变差的表现。

  • mem_fragmentation_ratio如果小于1,Redis很可能使用了虚拟内存,由于虚拟内存的媒介是磁盘,比内存速度要慢很多,由于硬盘速度远远慢于内存,redis性能会变得很差。Redis内存分配超出了物理内存,操作系统正在进行内存交换,内存交换会引起非常明显的响应延迟;图中的mem_fragmentation_ratio值很大 3.71远远大于1.5,是因为还没有向Redis中存入数据,Redis进程本身运行的内存使得used_memory_rss 比used_memory大得多。

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