美文网首页redis系列
redis数据结构(五):redis对象 robj

redis数据结构(五):redis对象 robj

作者: 范柏柏 | 来源:发表于2020-05-30 13:30 被阅读0次

    综述

    什么是robj

    • 简单动态字符串 SDS
    • 链表 list
    • 跳表 skiplist
    • 压缩列表 ziplist
    • 快速列表 quicklist
    • 字典 dict
    • 整数集合 intset

    这些都是底层数据结构。rediis并不会直接对外使用。redis会把他们再封装一层对外使用,封装的这一层就是robj。

    使用robj的好处是:

    • 可以针对不同的使用场景为对象设置多种不同类型的对象。从而优化对象在不同使用场景下的使用效率。

    • robj还实现了基于引用计数的内存回收机制,回收内存。另外redis还基于引用计数实现了对象共享机制,通过让redis键共享同一个对象来节约内存。

    来看看数据结构

    typedef struct redisObject {
    
        // 类型
        unsigned type:4;
        
        // 编码
        unsigned encoding:4;
        
        // 指向底层实现数据结构的指针
        void *ptr;
        
        // 引用计数
        int refcount;
        
        // 空转时长
        unsigned lru:22;
    }
    

    类型:指的是对外的类型
    编码:指的是对内的数据结构

    对外的类型 type

    类型常量 对象的名称
    REDIS_STRING 字符串对象
    REDIS_LIST 列表对象
    REDIS_HASH 哈希对象
    REDIS_SET 集合对象
    REDIS_ZSET 有序集合对象

    字符串对象

    字符串对象.png

    列表对象

    列表对象.png

    哈希对象

    哈希对象.png

    集合对象

    集合对象.png

    有序集合对象

    有序集合对象.png

    对内数据结构 encoding

    编码常量 所对应的底层数据结构
    REDIS_ENCODING_INT long类型整数
    REDIS_ENCODING_EMBSET embstr编码的SDS
    REDIS_ENCODING_RAW SDS
    REDIS_ENCODING_HT 字典
    REDIS_ENCODING_LINKEDLIST 双向链表
    REDIS_ENCODING_ZIPLIST 压缩列表
    REDIS_ENCODING_SKIPLIST 跳表
    REDIS_ENCODING_INTSET 整数集合

    使用object encoding 命令可以打印出 编码

    编码.png

    类型和编码的搭配

    类型 编码 对象
    string int 使用整数值实现的字符串对象
    string embstr 使用embstrSDS实现的字符串对象
    string raw 使用SDS实现的字符串对象
    list ziplist 使用压缩列表实现的列表对象
    list linkedlist 使用双向链表实现的列表对象
    hash ziplist 使用压缩列表实现的哈希对象
    hash ht 使用字典实现的哈希对象
    set intset 使用整数集合实现的集合对象
    set ht 使用字典实现的集合对象
    zset ziplist 使用压缩列表实现的有序集合对象
    zset skiplist 使用跳表和字典实现的有序集合对象

    相关文章

      网友评论

        本文标题:redis数据结构(五):redis对象 robj

        本文链接:https://www.haomeiwen.com/subject/olrqzhtx.html