五种基本类型
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_INT | long 类型的整数 | “int” |
REDIS_ENCODING_EMBSTR | embstr 编码的简单动态字符串 | “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:不满足以上两个条件