赞
踩
redis的String数据类型可能是我们使用最多的了,本文就一起来看下其底层是如何存储的,以及这种存储结构是否可能存在什么问题。下面我们就开始吧!
首先我们还是要看下,redis的全局数据是如何存储的,redis的全局数据是用一个大的字典来存储的,存储的元素是dictEntry,dictEntry内是指向key的指针,指向value的指针,以及指向哈希冲突的下一个元素的dictEntry指针,结构如下:
其中key的值
和value的值
部分并非直接存储的实际值,而是RedisObject结构体,其中的元数据用来保存值的创建时间,修改时间等元数据,此时结构变为下图:
其中的实际值
部分才是保存实际值的(可能是指针,或真实的值)
,各种数据结构的值其实都是保存在这里的,本文要分析的String也不例外。到这里我们需要先看下redis用来存储String具体值的结构体SDS(simple dynamic string),结构体结构如下:
各部分含义如下:
buff:字节数组,存储实际值,以\0作为结束符号,额外占用一个字节
len:buff已经使用的长度,即数据的长度,占4个字节
alloc:buff实际分配的长度,占4个字节
只有在存储的值是字符串时才会使用,如果是整数的话,则在RedisObject中保存的直接是该数字,占用4个字节,否则字符串使用SDS的话则保存的是实际值的指针,占用8个字节,这两种情况RedisObject如下:
实际上当存储的字符串小于44字节的时候,也是直接存储值的,这样可以有效避免内存碎片的问题,所以具体的存储可以分为整数存储,不超过44字节的字符串的SDS存储,大于44字节的字符串的SDS存储,其中整数存储方式我们叫做Int编码方式,不超过44字节的存储方式叫做embstr编码方式,大于44字节的存储方式叫做raw编码,如下图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。