• Redis入门到通关之数据结构解析-RedisObject




    在这里插入图片描述

    欢迎来到 请回答1024 的博客

    🍓🍓🍓欢迎来到 请回答1024的博客

    关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸的后端开发者。

    博客特色: 在我的博客中,开设了如下专栏(点击可以进入专栏奥~): JavaMySQLRedisSpringSpringBootSpringCloudRabbitMQ微服务分布式 等相关技术专栏。期待与您一起,探索编程世界中的发现和创新之旅。

    🍎🍎🍎我的主页 : https://reply1024.blog.csdn.net

    敬请期待定期更新、见解和教程!让我们一起踏上这段编码冒险之旅!

    数学与计算的边界 时间与空间的平衡 0与1的延伸

    ☃️概述

    RedisObject 是 Redis 中表示数据对象的结构体,它是 Redis 数据库中的基本数据类型的抽象。在 Redis 中,所有的数据都被存储为 RedisObject 类型的对象。

    RedisObject 结构体定义如下(简化版本):

    typedef struct redisObject {
        unsigned type:4; // 数据类型,如字符串、列表、哈希等
        unsigned encoding:4; // 编码方式,如 int、raw、hashtable 等
        unsigned lru:LRU_BITS; // Least Recently Used,用于记录对象最近被访问的时间
        int refcount; // 引用计数,用于自动内存管理
        void *ptr; // 指向实际存储数据的指针
    } robj;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    RedisObject 结构体包含以下几个重要的字段:

    type:表示数据对象的类型,如字符串、列表、哈希等,用 4 位表示,对应着 Redis 的几种基本数据类型。
    encoding:表示数据对象的编码方式,如 int、raw、hashtable 等,用 4 位表示,不同的编码方式对应不同的存储结构。
    lru:记录对象最近被访问的时间,用于实现 LRU 策略,LRU_BITS 表示存储 lru 的位数。
    refcount:引用计数,用于自动内存管理,当引用计数为 0 时,表示对象可以被释放。
    ptr:指向实际存储数据的指针,根据不同的数据类型和编码方式,指向不同的数据结构。

    RedisObject 结构体的引入使得 Redis 能够以统一的方式处理不同类型的数据,同时通过引用计数和 LRU 机制,实现了自动内存管理和淘汰策略,保证了 Redis 数据库的高效性和稳定性。


    ☃️源码

    Redis中的任意数据类型的键和值都会被封装为一个RedisObject,也叫做Redis对象,源码如下:

    在这里插入图片描述

    1、什么是redisObject:
    从Redis的使用者的角度来看,⼀个Redis节点包含多个database(非cluster模式下默认是16个,cluster模式下只能是1个),而一个database维护了从key space到object space的映射关系。这个映射关系的key是string类型,⽽value可以是多种数据类型,比如:
    string, list, hash、set、sorted set等。我们可以看到,key的类型固定是string,而value可能的类型是多个。
    ⽽从Redis内部实现的⾓度来看,database内的这个映射关系是用⼀个dict来维护的。dict的key固定用⼀种数据结构来表达就够了,这就是动态字符串sds。而value则比较复杂,为了在同⼀个dict内能够存储不同类型的value,这就需要⼀个通⽤的数据结构,这个通用的数据结构就是robj,全名是redisObject。

    Redis的编码方式

    Redis中会根据存储的数据类型不同,选择不同的编码方式,共包含11种不同类型:

    编号编码方式说明
    0OBJ_ENCODING_RAWraw编码动态字符串
    1OBJ_ENCODING_INTlong类型的整数的字符串
    2OBJ_ENCODING_HThash表(字典dict)
    3OBJ_ENCODING_ZIPMAP已废弃
    4OBJ_ENCODING_LINKEDLIST双端链表
    5OBJ_ENCODING_ZIPLIST压缩列表
    6OBJ_ENCODING_INTSET整数集合
    7OBJ_ENCODING_SKIPLIST跳表
    8OBJ_ENCODING_EMBSTRembstr的动态字符串
    9OBJ_ENCODING_QUICKLIST快速列表
    10OBJ_ENCODING_STREAMStream流

    五种数据结构

    Redis中会根据存储的数据类型不同,选择不同的编码方式。每种数据类型的使用的编码方式如下:

    数据类型编码方式
    OBJ_STRINGint、embstr、raw
    OBJ_LISTLinkedList和ZipList(3.2以前)、QuickList(3.2以后)
    OBJ_SETintset、HT
    OBJ_ZSETZipList、HT、SkipList
    OBJ_HASHZipList、HT

    在这里插入图片描述



  • 相关阅读:
    【正则表达式系列】常用正则
    5分钟学会 Lambda 表达式,一篇就够了!
    拥抱AI,怎么跨越Prompt这道鸿沟?
    Java中判断两个Long类型是否相等
    Domino服务器SSL证书安装指南
    SQLSugar查询返回DataTable
    抽象工厂模式
    存储压测工具— — Cosbench教程
    深度分析React源码中的合成事件
    信奥中的数学:排列组合
  • 原文地址:https://blog.csdn.net/2301_78386975/article/details/137883129