Redis 基础结构

dict

dict是一个维护k-v映射关系的数据结构,与map相似,旨在解决查找问题。

dict优点主要在于rehash。

dict包含2个hash表ht[0]和ht[1],0用于平时使用,而1用于rehash。

dict的rehash是渐进性进行的,一种是按照时间(每次执行一个固定的时间)、一种是按照索引值(一次移动一个索引下的kv)。

渐进式的rehash使得其对dict的增删改查效率影响较小。

dict的增删查操作:

增和改:效率低?

未rehash时 加入hash表0。

rehash时 加入hash 1

删和查:

未rehash 查找0

rehash时 先找0 再找1。

SDS

sds是redis中的字符串结构。

sds结构主要包含一个数组存放字符串、free记录数组未使用字节、len记录数组已使用长度

sds优势:

1、o1复杂度的获取字符串长度 --sds里的len变量

2、杜绝缓存区溢出–sds的自动检测及扩展功能

3、减少内存重分配次数–sds的预分配功能(扩展时额外分配已使用长度的未使用空间)和惰性空间释放(字符串缩短时释放的空间不会立马释放)

4、二进制安全–sds的len变量判断结尾而不是c的空格

5、兼容c–sds仍会在字符串结尾加上一个空格

ziplist

一种特殊的双向链表。

特殊性:内存地址连续、可变长度的编码方式。

添加或删除可能引起连锁的更新操作--可变长度的编码方式。

quicklist

一种结合list和ziplist的链表

draw.io evaluation version
ziplist
ziplist
ziplist

每个节点由一个ziplist实现。主要客服ziplist由于内存连续而引起的插入操作大幅度移动的缺点。

相关参数设置:

list-max-ziplist-size -2
list-compress-depth 0

skiplist

跳跃表:有序/查找速率媲美平衡树。

intset

整数集合:保存数量不多且不重复的整数

特点:升级特性,当新加入的数据长度大于已有数据的长度时,intset会进行升级,增大存储数据的位数(16-32-64)。

优点:节省内存。

robj

robj是一个用来表示value数据类型的通用诗句结构

robj字段:

type:对象的数据类型 4bit,5种取值。(String、list、set、zset、hash)

encode:对象内部的表示方式,4bit,10种取值

type
encode
OBJ_STRING

OBJ_ENCODING_RAW:String使用sds表示

OBJ_ENCODING_INT:String为数字使用Long表示

OBJ_ENCODING_EMBSTR:嵌入式sds 32字节

OBJ_LIST

REDIS_ENCODING_ZIPLIST:ziplist

REDIS_ENCODING_LINKEDLIST:(以弃用)

OBJ_ENCODING_QUICKLIST

OBJ_SET

REDIS_ENCODING_HT:dict

REDIS_ENCODING_INTSET:(数量小且全为整数)intSet

OBJ_ZSET

REDIS_ENCODING_ZIPLIST:ziplist(数量与长度较小)

REDIS_ENCODING_SKIPLIST skiplist

OBJ_HASH

REDIS_ENCODING_ZIPLIST:ziplist(体量较小时)

REDIS_ENCODING_HT:dict

sds与嵌入式sds区别

创建sds的字符串需要调用2次内存

分别创建redisObject和sdshdr,而嵌入式sds只需要一次

创建和释放都访问一次内存,

嵌入式sds是连续的内存区域

32字节以内使用嵌入式sds

redis版本3.29 实测字符串长度为45时才会开始使用sds

append 操作会将其转化为sds。

你可能感兴趣的:(Redis 基础结构)