总结redis中对象的类型与编码

1. 简言

redis中使用对象来表示数据库中的键和值

每当我们在redis的数据库中新建立一个键值对时,redis会至少创建两个对象,一个对象用作键,一个对象用作值,其中键的对象一定是字符串对象,值的对象是字符串,列表,哈希,集合,有序集合中的一种

2. 实现

redis中每个对象都由一个redisObject的结构表示

typedef struct redisObject {
    // 类型
    unsigned type:4;
    // 编码
    unsigned encoding:4;
    // 指向底层实现数据结构的指针
    void* ptr;
    // ...
} robj;

3. type属性

type属性记录了对象的类型,这个属性的值对应如下表

类型常量对象的名称TYPE命令的返回值
REDIS_STRING字符串对象string
REDIS_LIST列表对象list
REDIS_HASH哈希对象hash
REDIS_SET集合对象set
REDIS_ZSET有序集合对象zset

备注:当我们对一个数据库键执行TYPE命令时,会返回数据库键对应的值对象的类型

例子:

redis> SET msg "hello world"
OK
redis> TYPE msg
string

redis> HMSET profile name Tom age 25 career Programmer
OK
redis> TYPE profile 
hash

4. encoding属性

encoding属性记录了对象所使用的的编码,也就是说这个对象使用了什么数据结构作为对象的底层实现

这个属性的值对应如下表

编码常量编码所对应的的底层数据结构OBJECT EN CODING 命令的返回
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

备注:当我们对一个数据库键执行OBJECT ENCODING命令时,会返回数据库键对应的值对象的类型

例子:

redis> SET msg "hello world"
OK
redis> OBJECT ENCODING msg
embstr

redis> SET story "long long long long long long long long long long long long long..."
OK
redis> OBJECT ENCODING story
raw

5. type属性和encoding属性的对应关系

类型(type属性)编码(encoding属性)注释
REDIS_STRINGREDIS_ENCODING_INT整数值实现的字符串(是整数时则使用long表示)
REDIS_STRINGREDIS_ENCODING_EMBSTRembstr编码的简单动态字符串实现的字符串(字符串长度小于等于32字节时)
REDIS_STRINGREDIS_ENCODING_RAW简单动态字符串实现的字符串(字符串长度大于32字节时)
REDIS_LISTREDIS_ENCODING_ZIPLIST压缩列表实现的列表(每个元素大小小于64字节 且 元素数小于512个)
REDIS_LISTREDIS_ENCODING_LINKEDLIST双向链表实现的列表(某个元素大小大于64字节 或 元素数大于512个)
REDIS_HASHREDIS_ENCODING_ZIPLIST压缩列表实现的哈希表(每个元素大小小于64字节 且 元素数小于512个)
REDIS_HASHREDIS_ENCODING_HT字典实现的哈希表(某个元素大小大于64字节 或 元素数大于512个)
REDIS_SETREDIS_ENCODING_INTSET整数集合实现的集合(每个元素都是整数 且 元素数不超过512个)
REDIS_SETREDIS_ENCODING_HT字典实现的集合(某个元素不是整数 或 元素数超过512个)
REDIS_ZSETREDIS_ENCODING_ZIPLIST压缩列表实现的有序集合(每个元素大小小于64字节 且 元素数小于128个)
REDIS_ZSETREDIS_ENCODING_SKIPLIST使用跳跃表+字典实现的有序集合(某个元素大小大于64字节 或 元素数超过128个)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值