redis内存模型

查询内存

查看内存info memory

# Redis分配器分配的内存总量(字节)
used_memory:24989816
# Redis分配器分配的内存总量
used_memory_human:23.83M
# Redis进程占据操作系统的内存(字节)
used_memory_rss:36409344
used_memory_peak:66819000
used_memory_peak_human:63.72M
used_memory_lua:41984
# 内存碎片比率,该值是used_memory_rss/ used_memory的比值
# 一般大于1,且该值越大,内存碎片比例越大
# 小于1,说明Redis使用了虚拟内存,由于虚拟内存的媒介是磁盘,比内存速度要慢很多
mem_fragmentation_ratio:1.46
# Redis使用的内存分配器
mem_allocator:jemalloc-3.6.0

内存划分

  • 数据: 作为数据库,数据是最主要的部分
  • 进程本身运行需要的内存: Redis主进程本身运行肯定需要占用内存,如代码、常量池等等
  • 缓冲内存: 缓冲内存包括客户端缓冲区、复制积压缓冲区、AOF缓冲区等
  • 内存碎片: 内存碎片是Redis在分配、回收物理内存过程中产生的

used_memory部分保存的是数据缓冲内存

内存分配器

Redis在编译时便会指定内存分配器;内存分配器可以是 libc 、jemalloc、tcmalloc,默认是jemalloc。
jemalloc在64位系统中,将内存空间划分为小、大、巨大三个范围;每个范围内又划分了许多小的内存块单位;当Redis存储数据时,会选择大小最合适的内存块进行存储。

jemalloc划分的内存单元如下图所示:
redis内存模型_第1张图片

数据存储

执行set hello world时,所涉及到的数据模型
redis内存模型_第2张图片

  1. dictEntry: Redis是Key-Value数据库,因此对每个键值对都会有一个dictEntry,里面存储了指向Key和Value的指针;next指向下一个dictEntry,与本Key-Value无关。
  2. key: 图中右上角可见,Key(”hello”)并不是直接以字符串存储,而是存储在SDS结构中。
  3. value: 既不是直接以字符串存储,也不是像Key一样直接存储在SDS中,而是存储在redisObject中。redisObject中的type字段指明了value对象的类型,ptr字段则指向对象所在的地址

redisObject

redisObject的定义如下(不同版本的Redis可能稍稍有所不同):

typedef struct redisObject 
{
	unsigned type:4;
	unsigned encoding:4;
	unsigned lru:REDIS_LRU_BITS;/* lru time (relative to server.lruclock) */
	int refcount;
	void *ptr;
} robj;
  • type字段表示对象的类型,占4个bit;目前包括REDISSTRING(字符串)、REDISLIST (列表)、REDISHASH(哈希)、REDISSET(集合)、REDIS_ZSET(有序集合)。
  • encoding表示对象的内部编码,占4个比特
  • lru记录的是对象最后一次被命令程序访问的时间,占据的比特数不同的版本有所不同(如4.0版本占24bit,2.6版本占22bit)。
  • refcount记录的是该对象被引用的次数,类型为整型。refcount的作用,主要在于对象的引用计数和内存回收。当refcount变为0时,对象占用的内存会被释放。
  • ptr指针指向具体的数据。

SDS-简单动态字符串(Simple Dynamic String)

SDS结构 sds的结构如下:

struct sdshdr 
{
	# len表示buf已使用的长度
	int len;
	# free表示buf未使用的长度
	int free;
	# buf表示字节数组,用来存储字符串
	char buf[];
};

buf数组的长度=free+len+1(其中1表示字符串结尾的空字符’\0’);
一个SDS结构占据的空间为:free所占长度+len所占长度+ buf数组的长度=4+4+free+len+1=free+len+9。

ps: 如果key的长度如果是8个字节,则SDS为17字节,jemalloc分配32字节;此时将key长度缩减为7个字节,则SDS为16字节,jemalloc分配16字节;

你可能感兴趣的:(redis)