redis数据类型及底层结构

redis数据类型

源码
类型

/* The actual Redis Object */
#define OBJ_STRING 0    /* String object. */
#define OBJ_LIST 1      /* List object. */
#define OBJ_SET 2       /* Set object. */
#define OBJ_ZSET 3      /* Sorted set object. */
#define OBJ_HASH 4      /* Hash object. */


结构

typedef struct redisObject {
	//类型
    unsigned type:4;
    //类型编码
    unsigned encoding:4;
    //实用LRU算法计算相对server.lruclock的LRU时间
    unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
                            * LFU data (least significant 8 bits frequency
                            * and most significant 16 bits access time). */
    
     //引用计数                       * 
    int refcount;
    //指向底层数据实现的指针
    void *ptr;
} robj;

redisObject结构中的type属性记录对象的属性 可以用type命令查看

/* Objects encoding. Some kind of objects like Strings and Hashes can be
 * internally represented in multiple ways. The 'encoding' field of the object
 * is set to one of this fields for this object. */
#define OBJ_ENCODING_RAW 0     /* Raw representation */
#define OBJ_ENCODING_INT 1     /* Encoded as integer */
#define OBJ_ENCODING_HT 2      /* Encoded as hash table */
#define OBJ_ENCODING_ZIPMAP 3  /* Encoded as zipmap */
#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define OBJ_ENCODING_INTSET 6  /* Encoded as intset */
#define OBJ_ENCODING_SKIPLIST 7  /* Encoded as skiplist */
#define OBJ_ENCODING_EMBSTR 8  /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */
#define OBJ_ENCODING_STREAM 10 /* Encoded as a radix tree of listpacks */

redisObject结构中的ptr指针指向对象底层实现的数据结构,而这些数据结构由redisObject中的encoding决定。用encoding记录不同对象使用的不同编码类型,而不同的编码类型就代表了不同的数据结构,可以使用OBJECT ENCODING命令查看

字符串对象

如果字符串是整数会按整数存储
在这里插入图片描述
如果字符串存的字符串值并且 长度大于32
在这里插入图片描述
如果字符串存的字符串值并且 长度小于等于32
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

列表对象

在这里插入图片描述
可以在配置文件设置大小
在这里插入图片描述

哈希对象

编码可以是ziplist 或者 hashtable

ziplist 的编码是 添加的键值对 总是放到一起,添加到ziplist最后面
用hashtable 编码,使用字典结构存储 键值对都是字符串对象
在这里插入图片描述
可以在配置文件设置大小

在这里插入图片描述

集合对象

底层 intset 或者hashtable
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
可以在配置文件设置大小
在这里插入图片描述

有序集合

/* ZSETs use a specialized version of Skiplists */
typedef struct zskiplistNode {
    sds ele;
    double score;
    struct zskiplistNode *backward;
    struct zskiplistLevel {
        struct zskiplistNode *forward;
        unsigned long span;
    } level[];
} zskiplistNode;

typedef struct zskiplist {
    struct zskiplistNode *header, *tail;
    unsigned long length;
    int level;
} zskiplist;

typedef struct zset {
    dict *dict;
    zskiplist *zsl;
} zset;

编码可以是ziplist 或者skiplist
使用ziplist 按分值从小到大排序,小的元素放到表头
在这里插入图片描述
在这里插入图片描述

skiplist中有zset结构包含一个字典和跳跃表 字典记录了每个成员到分值的映射,通过分值来排序
在这里插入图片描述

在这里插入图片描述
可以通过配置来改变 元素大小
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值