Redis数据结构底层(一)

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 结构体中的主要字段包括:

  1. type:表示数据类型,包括字符串(REDIS_STRING)、列表(REDIS_LIST)、哈希(REDIS_HASH)、集合(REDIS_SET)等。

  2. encoding:表示数据的编码方式,例如字符串可以使用 int、embstr、raw 三种编码方式。

  3. lru:用于记录数据对象的最近访问时间,结合 LRU 淘汰算法来进行数据淘汰。

  4. refcount:表示对象的引用计数,用于管理对象的生命周期,避免未引用的对象被回收。

  5. ptr:指向实际存储数据的指针,不同数据类型的数据存储方式不同。

为什么需要RedisObject这个数据结构?

通关redisObject数据结构和robj结构体,Redis能够统一管理不同类型的数据对象,并提供一致的接口进行数据操作,这样的设计使得Redis能够高效地处理各种数据类型,并实现丰富的功能,如内存管理、数据序列化、数据持久化等。

Redis底层6种数据结构

redis底层还有6种数据结构:SDS(简单动态字符串)IntSet(整形数组)Dic(字典[哈希表])ZipList(压缩列表)QuickList(双端链表)SkipList(跳表)

这6种数据结构也是redis中各种基本数据类型的实现。

它们和RedisObject的关系是:

image-20240704114237591

Redis中基本数据类型与底层数据结构的对应关系

String

String底层采用SDS存储,按照类型与长度采用了不同的编码方式,分别有:

  • int编码(针对Long类型整数)

  • embstr编码(字符串小于等于44字节)

  • raw编码(字符串大于44字节)

(注意:Long等数值类型在Redis中也是用String存储,但是编码方式不同!!)

Hash

Redis中的hash有以下特点:

  1. 键值存储

  2. 键唯一

  3. 无序性

hash类型底层采用Dic(哈希表)+ZipList(压缩列表)存储,数据量较小时采用ZipList,较大时升级为Dic

触发升级对应的条件为:

  1. 元素数量超过512个

  2. 元素大小超过64字节

List

Redis中的List有以下特点:

  1. 有序可重复

  2. 可两端操作

对应的底层数据结构:

  • redis3.2以前:LinkedList(双向链表)+ZipList(压缩列表)

  • Redis3.2以后:QuickList(双端链表)

Set

Redis中的Set有以下特点:

  1. 无序,不可重复

  2. 可以求交集、并集

对应的底层数据结构为IntSet(整数数组)+Dic(哈希表),当存储的元素都是整数且元素数量少于set-max-intset-entries时,采用IntSet,否则采用Dic

Zset

Redis中的Zset有以下特点

  1. 键唯一

  2. 有序

对应的底层数据结构为:

  • ZipList(压缩列表)

  • Dic(哈希表)+SkipList(跳表),哈希表保证唯一性,跳表保证有序性

当元素数量超过128个或元素长度超过64个字节时,会由ZipList转换为Dic+SkipList

以上就是关于redis中几种常见的数据类型的底层数据结构

我将在Redis数据结构底层(二)中带来关于这几种底层数据结构知识的讲解!!

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis底层使用了多种数据结构,包括链表、字典和跳跃表。链表是Redis自己构建的数据结构,因为C语言并没有内置链表结构。链表在Redis中被广泛应用,用于实现列表等数据类型。字典用于实现Redis中的键值对存储结构,它能够通过键快速地查找对应的值。跳跃表是一种用于有序集合键和集群节点内部数据结构数据结构,它能够提供较快的查找和插入操作。除了这些数据结构Redis还使用redisObject来表示这些数据结构底层实现,redisObject有三个重要的属性,分别是type、encoding、ptr。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Redis的六种底层数据结构](https://blog.csdn.net/A12115419/article/details/122198783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [redis数据结构底层实现](https://blog.csdn.net/qq_43216019/article/details/129225687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值