Redis数据结构原理总结

本文详细介绍了Redis中的五大数据结构:String、List、Set、Sorted Set和Hash,包括它们的底层实现、优缺点及使用场景。字符串类型支持存储二进制数据,列表和集合支持有序和无序的字符串元素,有序集合则根据分数排序,哈希存储键值对。Redis为这些数据结构使用了多种编码方式,如IntSet、ZipList、ListPack、HashTable和SkipList,以优化内存管理和查询效率。文章还探讨了Redis 6.0及7.0版本对数据结构的改进,如ListPack替代ZipList和SDS结构的优化。
摘要由CSDN通过智能技术生成
一、Redis简介

        Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,目前最新版本7.0。Redis提供了五种不同的数据结构来存储数据,分别是字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)和哈希(Hash)。

  • 字符串(String):字符串是最基本的数据类型,可以存储任何类型的字符串,包括二进制、序列化的对象等。
  • 列表(List):列表是一个双向链表,支持从两端进行push和pop操作,内部是按照插入顺序排序的。
  • 集合(Set):集合是一个无序的、不允许有重复成员的字符串集合。
  • 有序集合(Sorted Set):有序集合是一个不允许有重复成员的字符串集合。不同的是每个成员都会关联一个分数(score),根据分数对成员进行从小到大的排序。
  • 哈希(Hash):哈希是一个键值对集合,适合存储小型的数据表。
  二、Redis底层结构

        Redis的数据结构有字符串、双端链表、字典、压缩列表、整数集合等,但是Redis为了加快读写速度,并没有直接使用这些数据结构,而是在此基础上又包装了一层称之为RedisObject,RedisObject 有五种对象:字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)和哈希(Hash)。

①Redis内部统一实现 RedisObject有啥优点

  • 简化数据结构:RedisObject是Redis数据库的基本构建块,它将不同类型的值(字符串、列表、集合等)封装为一个统一的对象结构,简化了数据结构的设计。
  • 内存管理:RedisObject通过引用计数和内存回收机制管理内存,避免了额外的内存分配和释放开销。
  • 快速访问:通过使用RedisObject,Redis可以快速直接访问和操作不同类型的数据,提高了数据访问的效率。
  • 兼容性:RedisObject允许Redis支持不同的数据类型,并提供了一种在不同数据类型之间转换的机制。
  • 灵活性:RedisObject允许开发者根据需要扩展Redis的数据类型,以支持新的应用场景。

 ②RedisObject底层设计

typedef struct redisObject {
    // 类型
    unsigned type:4个bit;
    // 编码
    unsigned encoding:4个bit;
    // 对象最后一次被访问的时间
unsigned lru:REDIS_LRU_BITS; /* LRU_BITS为24bit*/
//引用计数
    int refcount;4个字节
    // 指向实际值的指针
    void *ptr;8个字节
} robj;

下面分别解释一下各个字段的含义:

Ⅰ、type 记录了对象的类型占4个bit位,目前Redis支持的对象类型如下:

类型常量

常量对应的对象类型

OBJ_STRING

字符串(String)

OBJ_LIST

列表(List)

OBJ_SET

集合(Set)

OBJ_ZSET

有序集合(Sorted Set)

OBJ_HASH

哈希(Hash)

Ⅱ、ptr 指向对象的底层实现数据结构,即为具体对象值,占8个字节,这个后面会具体分析。

Ⅲ、encoding表示 ptr 指向的具体数据结构的编码方式,占4个bit位。Redis支持的编码如下:

编码常量

编码所对应的底展数据结构

OBJ_ENCODING_INT

long 类型的整数

OBJ_ENCODING_EMBSTR

embstr编码的简单动态字符串

OBJ_ENCODING_RAW

简单动态字符申

OBJ_ENCODING_HT

字典

OBJ_ENCODING_LINKEDLIST  

双端链表,Redis3.2之前使用

OBJ_ENCODING_ZIPLIST

压缩列表

OBJ_ENCODING_QUICKLIST

双端链表与压缩列表结合,Redis3.2之后使用

OBJ_ENCODING_INTSET

整数集合

OBJ_ENCODING_SKIPLIST

跳跃表

OBJ_ENCODING_ZIPMAP

压缩Map,Redis2.6之前使用

OBJ_ENCODING_STREAM

Stream流

         上面提到的type 用于标识 String、Hash、List、Set、Sorted Set五种数据类型、encoding 用于标识底层数据结构。通过这两个字段的组合,同一种数据类型也有多种实现方式,一个完整的映射关系如下表:

类型type

编码encoding

描述

OBJ_STRING

OBJ_ENCODING_INT

整数实现字符串对象

OBJ_STRING

OBJ_ENCODING_EMBSTR

embstr编码实现字符串对象

OBJ_STRING

OBJ_ENCODING_RAW

sds实现字符串对象

OBJ_LIST

OBJ_ENCODING_LINKEDLIST  

双端链表实现列表对象

OBJ_LIST

OBJ_ENCODING_ZIPLIST

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值