Redis 底层数据结构之String】的更多相关文章

文章参考:<Redis设计与实现>黄建宏 Redis 的 string 类型底层使用的是 SDS(动态字符串) 实现的, 具体数据结构如下: struct sdshdr { int len; // 记录字符串长度 int free; // 记录 buf 数组中未使用字节的数量 char buf[]; // 保存字符串的字节数组 } 例如: free = 0 代表这个 SDS 没有空闲空间存放字符 len = 5 代表这个 SDS 存放的字符串长度是 5 buf 是一个字符数组,保存了 Redi…
Redis 底层数据结构 版本:2.9 支持的数据类型: 字符串 散列 列表 集合 有序集合 字符串 Redis 利用原生的 c 字符串进行了一次封装.封装的字符串叫做简单动态字符串:SDS(simple dynamic string) Redis 使用的简单动态字符串比 c 语言原生的字符串有以下优点: 获取字符串长度的复杂度为O(1) 不存在缓存区溢出 修改字符串长度时,不需要频繁分配内存 空间预分配策略 惰性空间策略 二进制安全 二进制安全的意思是,可以将二进制数据使用 SDS 存储,而不…
上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言所写,所以以下会有c语言的片段,不过都是一些定义,很好理解. Redis底层数据结构有六种: 1.简单动态字符串 2.链表 3.字典 4.跳跃表 5.整数集合 6.压缩列表 7.快速列表 接下来看一下每种数据结构到底是啥? 一.简单动态字符串 (1)Redis默认字符串底层存储结构,比如set k1 v1,键…
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.redis底层使用了多种数据结构来实现各种特性.对于Redis底层实现的了解,可以让我们对Redis工作原理更加清晰. 那么redis数据结构与内部编码,如下图: redis对象(redisObject) redis源码内部是有一个redisObject对象,redis的键值都是redisObject对象…
在上一节提到的图中,我们知道,可以通过 redisObject 对象的 type 和 encoding 属性.可以决定Redis 主要的底层数据结构:SDS.QuickList.ZipList.HashTable.IntSet.ZskipList . 一.简单动态字符串(SDS) 先来看看传统的C 语言如何存储字符串的:比如一个 "Redis" 字符串: 为什么不用传统的 C 语言的方式,因为我们知道数组方式在获取字符串长度或者扩容上存在缺陷:比如获得一个数组长度的复杂度为O(N),…
简单动态字符串SDS 包含字符串长度,剩余可用长度,字符数组 用于Redis中所有的string存储 字典(map) 数组+链表形式,跟hashMap很像 链地址法解决hash冲突 rehash使用新建hash数组链表进行数据rehash迁移,扩容是大于原数组长度的第一个2的n次幂 渐进式rehash,就是不是一次性迁移完,而是在CRUD操作时,一点点迁移 用于hash类型数据 链表 双端列表,直接有列表长度属性 用于list类型数据 跳跃表 带分值得一种有序类链表结构 每个节点中的level中…
1.动态字符串 redis中使用c语言的字符床存储字面量,默认字符串存储采用自己构建的简单动态字符串SDS(symple dynamic string) redis包含字符串的键值对都是用SDS实现的 结构s d s.h/sdshdr struct sdshdr{ int len; //buf使用的长度 SDS的长度 int free; //buf未使用的长度 char buf[]; //字节数据,保持字符串 } free属性值 0,表示SDS没有分配使用空间 len属性值 5 表示SDS保存了…
REDIS  较宽泛的支持5种数据结构  分别为 字符串 列表 集合 散列 有序集合 关于这几种数据结构的使用 相信网上有很多资料,查看官网API 也很详细了  读者可以自己随意翻阅 很方便 . 接下来介绍的是  这些数据结构背后的实现 .更底层的数据结构实现 (1)先介绍SDS这种数据结构 :SDS[simple dynamic string]简单动态字符串 我们先说场景:比如用的比较多的SET命令  set msg  "hello" 那么过程是什么样子的呢 Redis将在数据库中创…
压缩列表是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现 当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现. 压缩列表是Redis为了节约内存而开发的是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值 z…
整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时Redis就会使用整数集合作为集合键的底层实现 整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int_16,int_32,int_64的整数值并且保证集合中不会出现重复元素 contents 数组是整数集合的底层实现:整数集合的每个元素都是contents数组的一个数组项,各个项在数组中按值的大小从小到大有序地排列,并且数组中不包括任何重复项 length 属性记录了整数集合包含的元素…