Redis对象类型、对象编码及对应关系
2020-05-17 本文已影响0人
Muscleape
摘要
1、 Redis数据库中保存的键值对,键总是一个字符串对象,而值可以是字符串对象、列表对象、哈希对象、集合对象、有序集合对象;
Redis对象
Redis中对象都是由RedisObject结构表示,该结构中与数据保存有关的三个属性分别是type属性,encoding属性、ptr属性:
typedef struct redisObject{
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
// 指向底层实现数据结构的指针
void *ptr;
// ... 其他
} robj;
类型
RedisObject对象的属性"type"记录了对象的类型,也就是常说的Redis支持的5种数据类型;
类型常量 | 对象的名称 | type命令输出 |
---|---|---|
REDIS_STRING | 字符串对象 | "string" |
REDIS_LIST | 列表对象 | "list" |
REDIS_HASH | 哈希对象 | "hash" |
REDIS_SET | 集合对象 | "set" |
REDIS_ZSET | 有序集合对象 | "zset" |
编码和底层实现
encoding:对象使用的编码,也就是使用了什么数据结构作为对象的底层实现;
对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定;
编码常量 | 编码对应的底层数据结构 |
---|---|
REDIS_ENCODING_INT | long类型的整数 |
REDIS_ENCODING_ EMBSTR | embstr编码的简单动态字符串 |
REDIS_ENCODING_ RAW | 简单动态字符串 |
REDIS_ENCODING_HT | 字典 |
REDIS_ENCODING_ LINKEDLIST | 双向链表 |
REDIS_ENCODING_ZIPLIST | 压缩列表 |
REDIS_ENCODING_INTSET | 整数集合 |
REDIS_ENCODING_SKIPLIST | 跳跃表和字典 |
类型和编码的对应关系
每种类型的对象至少使用两种不同的编码
类型 | 编码 | 对象 |
---|---|---|
REDIS_STRING | REDIS_ENCODING_INT | 使用整型值实现的字符串对象 |
REDIS_STRING | REDIS_ENCODING_ EMBSTR | 使用embstr编码的简单动态字符串实现的字符串对象 |
REDIS_STRING | REDIS_ENCODING_ RAW | 使用简单动态字符串实现的字符串对象 |
REDIS_LIST | REDIS_ENCODING_ZIPLIST | 使用压缩列表实现的列表对象 |
REDIS_LIST | REDIS_ENCODING_ LINKEDLIST | 使用双向链表实现的列表对象 |
REDIS_HASH | REDIS_ENCODING_ZIPLIST | 使用压缩列表实现的哈希对象 |
REDIS_HASH | REDIS_ENCODING_HT | 使用字典实现的哈希对象 |
REDIS_SET | REDIS_ENCODING_INTSET | 使用整数集合实现的集合对象 |
REDIS_SET | REDIS_ENCODING_HT | 使用字典实现的集合对象 |
REDIS_ZSET | REDIS_ENCODING_ZIPLIST | 使用压缩列表实现的有序集合对象 |
REDIS_ZSET | REDIS_ENCODING_SKIPLIST | 使用跳跃表和字典实现的有序集合对象 |