×

redis数据类型底层实现 dis

redis数据类型底层实现(Redis底层数据结构解密)

admin admin 发表于2023-09-14 17:19:20 浏览34 评论0

抢沙发发表评论

本文目录

Redis底层数据结构解密

一:摘要概述很多 redis 的使用者都可以清晰明白的道出Redis中常用的对象如string、list、hash、set、zset,一些场景比较丰富的使用者可能会说布隆过滤器、geo、Hash等。但是对于这些对象底层实现的数据结构却是知之甚少,将会详细阐述redis中的底层数据结构。为了弥补大家的创伤,今天分享Redis底层数据结构内容。二:SDSstring作为redis中常用对象之一,普遍用于用户信息缓存等场景。当string对象中encoding编码为embstr或raw时都是采用sds作为其底层实现2.1 SDS结构源码文件位于redis安装目录src下的sds.h,sds声明了五种头部类型,分别为sdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64。根据字符串长度创建不同头部的sds实例struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len;uint8_t alloc;unsigned char flags;char buf;};属性名称作用含义len字符串长度alloc预分配空间大小flags低三位用于表示sds类型,可以查看sds.h文件76-82行定义buf存储字符串用数组2.2 SDS与C字符串区别区别描述长度计算 c中的字符串长度计算需要数组遍历,但是redis中的sds自身维护了len属性。所以O(1)时间复杂度即可缓冲区溢出c中字符串更改如果未提前做好内存分配则会内存溢出,但是sds则会根据alloc与len计算预留内存是否足够分配重新申请内存动态扩展 缓冲区溢出已经阐述这个概念,sds的内存空间会在字符串内容变更时自动扩展计算。策略为当字符换小于1M时*2翻倍,大于1M时每次扩容1M惰性释放 与空间预分配相似操作的还有内存惰性释放,即字符串删除某些内容后所占用的内存空间并不会立即释放,后续字符串变更扩展就无需再申请内存二:ZipListziplist可以说把redis对于内存的极致操作体现的淋漓尽致,链表除了节点值之外还需要维护前后节点两个指针,并且还会造成内存碎片。压缩列表紧凑的内存布局,所有节点都维护在整块内存中处理2.1 ZipList结构属性名称作用含义zlbytes列表健占用内存的总字节数,在对列表健内存重分配或者是计算zlend的时候使用zltail 指向压缩列表起始地址的指针zllen 压缩列表的节点数量entry压缩列表保存的节点数据zlend压缩列表的尾节点2.2 Entry节点结构属性名称作用含义previous_entry_length 字节为单位记录上一个节点的长度,如果上一个字节长度小于254占用1字节。大于254占用5字节,第一个字节设置为OxFE(十进制254),后面四个字节储存长度encoding 记录content记录的数据类型以及长度。长度一、二、五字节,值的最高位为00、01、10表示类型为字节数组,长度使用除去最高位的其它位记录。11开头表示储存整数,除去最高位其他位置表示content数据长度content 记录压缩列表记录的数据

Redis支持几种数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象,string 类型的值最大能存储 512MB。

Redis hash是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

Redis list是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。

Redis的Set是string类型的无序集合,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

Redis中的集合类型是怎么实现的

  Redis里面使用intset是为了实现集合(set)这种对外的数据结构。  set结构类似于数学上的集合的概念,它包含的元素无序,且不能重复。  Redis里的set结构还实现了基础的集合并、交、差的操作。  与Redis对外暴露的其它数据结构类似,set的底层实现,随着元素类型是否是整型以及添加的元素的数目多少,而有所变化。概括来讲,当set中添加的元素都是整型且元素数目较少时,set使用intset作为底层数据结构,否则,set使用dict作为底层数据结构。

redis数据类型是什么

一、string

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

命令: SET 和 GET 命令

二、hash 

Redis hash 是一个键值(key=》value)对集合。

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

HMSET, HGET 命令,HMSET 设置了两个 field=》value 对, HGET 获取对应 field 对应的 value。

三、list

列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。lpush 设置值,lrange取值

四、set

redis的set是string的无序集合。集合通过哈希表实现。

添加一个string元素到key对应的set集合中,用 sadd命令。返回1表示成功,0表示在集合中已存在,返回错误表示key对应的set不存在。

查看用smembers 命令

集合内元素的唯一性,第二次插入的元素将被忽略。

集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

五、zset 

redis的zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

添加元素到集合,元素在集合中存在则更新对应score:zadd key score member。

Redis数据模型

Redis的外围由一个键、值映射的字典构成。与其他非关系型数据库主要不同在于:Redis中值的类型不仅限于字符串,还支持如下抽象数据类型:

1、字符串列表

2、无序不重复的字符串集合

3、有序不重复的字符串集合

4、键、值都为字符串的哈希表

值的类型决定了值本身支持的操作。Redis支持不同无序、有序的列表,无序、有序的集合间的交集、并集等高级服务器端原子操作。