Redis作为高并发程序的必备神器,基本是必不可少的一款中间件,在日常使用中,对Redis的增删改查的过程中,你有没有想过每条命令在Redis中是如何执行的,不同的数据类型是通过什么样的数据结构保存在Redis的内存中呢?什么!不知道? 没关系,看完这篇文章你就知道了~
Redis在日常开发中常用的五种数据结构,分别为String
、List
、Hash
、Set
、Zset
,不同的应用场景不同的数据结构来支持,下面就一起看看到底是什么样的数据结构让Redis这么快,开干!
对象
Redis数据库中,我们常用的五种数据类型并不是由某种数据结构直接实现,而基于数据结构构建了对象系统,包含字符串对象、列表对象、哈希对象、集合对象、有序集合对象,每种对象都至少使用到2中数据结构进行实现!
-
对象的结构
typeof struct redisObject { // 对象类型 unsigned type:4; // 编码 unsigned encoding:4; // 指向底层具体数据结构的指针 void *ptr; }
-
类型:一共有5中类型,分别为字符串对象、列表对象、哈希对象、集合对象、有序集合对象
type key – 查看key的类型
-
**编码:**编码标识对象使用了什么样的编码,即具体的底层数据结构是什么(不同的编码,则不同的数据结构来实现),并且不同编码之间会根据具体保存的数据转换。
-
**指针:**执行对象的底层数据结构的指针
-
字符串对象String
String
在Redis中准确的应该是字符串对象,字符串对象的底层实现数据结构分别有:int
、raw
、embstr
、sds
等。
int、raw、embstr编码格式
这三种实现分别是字符串的不同编码格式,当不同类型的字符串时,使用不同的编码格式进行存储,最大程度的节约内存和提升效率。当字符串中保存的都是整数,会使用int类型的编码,当保存的字符串较短时,则使用raw或embstr进行保存。
SDS编码格式
众所周知,Redis是使用C语言写的,但是其中的字符串并没有使用C语言中的字符串,而是自己实现了字符串,名为简单动态字符串(SDS)
Redis中不仅将SDS作为String的底层数据结构的实现,同时SDS还应用于各种场景,例如:列表、Redis的key等。
SDS的实现
既然Redis舍弃了C语言中的字符串, 单独实现了SDS作为字符串的实现,那么SDS有哪些优点呢
-
SDS的结构
struct sdshdr { // 记录sds字符串的长度,相当于buf数组中已使用的长度 int len; // 记buf数组中还没有使用的长度,可用长度 int free; // 字符数组,保存字符串 char buf[]; }
首先可以看到sds的结构定义,记录了自身的字符串的长度,没有使用的内存长度,相对于C字符串可以提升较大的使用效率
-
与C字符串区别
-
当使用命令
strlen
时:C字符串并不记录自身的长度&
-