redis之String是如何存储的

写在前面

redis之String是如何存储的_第1张图片
redis的String数据类型可能是我们使用最多的了,本文就一起来看下其底层是如何存储的,以及这种存储结构是否可能存在什么问题。下面我们就开始吧!

1:如何存储

首先我们还是要看下,redis的全局数据是如何存储的,redis的全局数据是用一个大的字典来存储的,存储的元素是dictEntry,dictEntry内是指向key的指针,指向value的指针,以及指向哈希冲突的下一个元素的dictEntry指针,结构如下:

redis之String是如何存储的_第2张图片

其中key的值value的值部分并非直接存储的实际值,而是RedisObject结构体,其中的元数据用来保存值的创建时间,修改时间等元数据,此时结构变为下图:

redis之String是如何存储的_第3张图片

其中的实际值部分才是保存实际值的(可能是指针,或真实的值),各种数据结构的值其实都是保存在这里的,本文要分析的String也不例外。到这里我们需要先看下redis用来存储String具体值的结构体SDS(simple dynamic string),结构体结构如下:

redis之String是如何存储的_第4张图片

各部分含义如下:

buff:字节数组,存储实际值,以\0作为结束符号,额外占用一个字节
len:buff已经使用的长度,即数据的长度,占4个字节
alloc:buff实际分配的长度,占4个字节

只有在存储的值是字符串时才会使用,如果是整数的话,则在RedisObject中保存的直接是该数字,占用4个字节,否则字符串使用SDS的话则保存的是实际值的指针,占用8个字节,这两种情况RedisObject如下:

redis之String是如何存储的_第5张图片

实际上当存储的字符串小于44字节的时候,也是直接存储值的,这样可以有效避免内存碎片的问题,所以具体的存储可以分为整数存储,不超过44字节的字符串的SDS存储,大于44字节的字符串的SDS存储,其中整数存储方式我们叫做Int编码方式,不超过44字节的存储方式叫做embstr编码方式,大于44字节的存储方式叫做raw编码,如下图:

redis之String是如何存储的_第6张图片

你可能感兴趣的:(redis,redis,sds,string)