(三)、Redis对象类型和底层数据结构对应关系---Redis设计与实现读书笔记

五种基本类型

Redis创建一个键值对时至少会创建两个对象,一个对象用作键值对的键(键对象),另一个对象用作键值对的值(值对象)。其中总是一个字符串对象,则可以是以下五种对象中的一种。

类型常量对象的名称type命令输出
REDIS_STRING字符串对象“string”
REDIS_LIST列表对象“list”
REDIS_HASH哈希对象“hash”
REDIS_SET集合对象“set”
REDIS_ZSET有序集合对象“zset”

Redis中每个对象都由RedisObject结构表示:

typedef struct redisObject {  
    // 类型  
    unsigned type:4;          
    // 不使用(对齐位)  
    unsigned notused:2;  
    // 编码方式  
    unsigned encoding:4;  
    // LRU 时间(相对于 server.lruclock)  
    unsigned lru:22;  
    // 引用计数  
    int refcount;  
    // 指向底层实现数据结构的指针
    void *ptr;  
} robj; 

编码和底层实现

编码常量底层数据结构object encoding命令输出
REDIS_ENCODING_INTlong 类型的整数“int”
REDIS_ENCODING_EMBSTRembstr 编码的简单动态字符串“embstr”
REDIS_ENCODING_RAW简单动态字符串“raw”
REDIS_ENCODING_HT字典“hashtable”
REDIS_ENCODING_LINKEDLIST双端链表“linkedlist”
REDIS_ENCODING_ZIPLIST压缩列表“ziplist”
REDIS_ENCODING_INTSET整数集合“intset”
REDIS_ENCODING_SKIPLIST跳跃表和字典“skiplist”

##字符串对象
编码类型:

  • int:当一个字符串对象保存的是整数值,并且可用long类型表示时,字符串对象的编码设置为int;
  • embstr:当一个字符串对象保存的是字符串值,并且字符串长度小于39字节,字符串对象的编码设置为embstr;
  • raw:当一个字符串对象保存的是字符串值,并且字符串长度大于39字节,字符串对象的编码设置为raw;

##列表对象
编码类型:【注意:3.2版本后统一使用quicklist作为编码类型】

  • ziplist:满足以下两个条件
    • 列表对象保存的所有字符串元素的长度都小于64字节
    • 列表对象保存的元素数量小于512个;
  • linkedlist:不满足以上两个条件

##哈希对象
编码类型:

  • ziplist:满足以下两个条件
    • 哈希对象保存的所有键值对的键和值得字符串长度小于64字节
    • 哈希对象保存的键值对数量小于512个
  • hashtable:不满足以上两个条件

##集合对象
编码类型:

  • intset:满足以下两个条件
    • 集合对象保存的所有元素都是整数值
    • 集合对象保存的元素数量小于512个
  • hashtable:不满足以上两个条件

##有序集合对象
编码类型:

  • ziplist:满足以下两个条件
    • 有序集合对象保存的所有元素成员长度小于64字节
    • 有序集合对象保存的元素数量小于128个
  • skiplist:不满足以上两个条件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值