redis中核心数据结构:RedisObject
在redis中,redisObject是一个核心的数据结构,用于表示redis中的各种数据类型,包括字符串、列表、哈希、集合、有序集合等。我们可以在redis.h头文件中找到对应的结构体定义:
RedisObject结构体定义
typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; int refcount; void *ptr; } robj;
robj
结构体中的主要字段包括:
-
type
:表示数据类型,包括字符串(REDIS_STRING)、列表(REDIS_LIST)、哈希(REDIS_HASH)、集合(REDIS_SET)等。 -
encoding
:表示数据的编码方式,例如字符串可以使用 int、embstr、raw 三种编码方式。 -
lru
:用于记录数据对象的最近访问时间,结合 LRU 淘汰算法来进行数据淘汰。 -
refcount
:表示对象的引用计数,用于管理对象的生命周期,避免未引用的对象被回收。 -
ptr
:指向实际存储数据的指针,不同数据类型的数据存储方式不同。
为什么需要RedisObject这个数据结构?
通关redisObject数据结构和robj结构体,Redis能够统一管理不同类型的数据对象,并提供一致的接口进行数据操作,这样的设计使得Redis能够高效地处理各种数据类型,并实现丰富的功能,如内存管理、数据序列化、数据持久化等。
Redis底层6种数据结构
redis底层还有6种数据结构:SDS(简单动态字符串)、IntSet(整形数组)、Dic(字典[哈希表])、ZipList(压缩列表)、QuickList(双端链表)、SkipList(跳表)
这6种数据结构也是redis中各种基本数据类型的实现。
它们和RedisObject的关系是:
Redis中基本数据类型与底层数据结构的对应关系
String
String底层采用SDS存储,按照类型与长度采用了不同的编码方式,分别有:
-
int编码(针对Long类型整数)
-
embstr编码(字符串小于等于44字节)
-
raw编码(字符串大于44字节)
(注意:Long等数值类型在Redis中也是用String存储,但是编码方式不同!!)
Hash
Redis中的hash有以下特点:
-
键值存储
-
键唯一
-
无序性
hash类型底层采用Dic(哈希表)+ZipList(压缩列表)存储,数据量较小时采用ZipList,较大时升级为Dic
触发升级对应的条件为:
-
元素数量超过512个
-
元素大小超过64字节
List
Redis中的List有以下特点:
-
有序可重复
-
可两端操作
对应的底层数据结构:
-
redis3.2以前:LinkedList(双向链表)+ZipList(压缩列表)
-
Redis3.2以后:QuickList(双端链表)
Set
Redis中的Set有以下特点:
-
无序,不可重复
-
可以求交集、并集
对应的底层数据结构为IntSet(整数数组)+Dic(哈希表),当存储的元素都是整数且元素数量少于set-max-intset-entries时,采用IntSet,否则采用Dic
Zset
Redis中的Zset有以下特点
-
键唯一
-
有序
对应的底层数据结构为:
-
ZipList(压缩列表)
-
Dic(哈希表)+SkipList(跳表),哈希表保证唯一性,跳表保证有序性
当元素数量超过128个或元素长度超过64个字节时,会由ZipList转换为Dic+SkipList
以上就是关于redis中几种常见的数据类型的底层数据结构
我将在Redis数据结构底层(二)中带来关于这几种底层数据结构知识的讲解!!