综述
什么是robj
- 简单动态字符串 SDS
- 链表 list
- 跳表 skiplist
- 压缩列表 ziplist
- 快速列表 quicklist
- 字典 dict
- 整数集合 intset
这些都是底层数据结构。rediis并不会直接对外使用。redis会把他们再封装一层对外使用,封装的这一层就是robj。
使用robj的好处是:
-
可以针对不同的使用场景为对象设置多种不同类型的对象。从而优化对象在不同使用场景下的使用效率。
-
robj还实现了基于引用计数的内存回收机制,回收内存。另外redis还基于引用计数实现了对象共享机制,通过让redis键共享同一个对象来节约内存。
来看看数据结构
typedef struct redisObject {
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
// 指向底层实现数据结构的指针
void *ptr;
// 引用计数
int refcount;
// 空转时长
unsigned lru:22;
}
类型:指的是对外的类型
编码:指的是对内的数据结构
对外的类型 type
类型常量 | 对象的名称 |
---|---|
REDIS_STRING | 字符串对象 |
REDIS_LIST | 列表对象 |
REDIS_HASH | 哈希对象 |
REDIS_SET | 集合对象 |
REDIS_ZSET | 有序集合对象 |
字符串对象
列表对象
哈希对象
集合对象
有序集合对象
对内数据结构 encoding
编码常量 | 所对应的底层数据结构 |
---|---|
REDIS_ENCODING_INT | long类型整数 |
REDIS_ENCODING_EMBSET | embstr编码的SDS |
REDIS_ENCODING_RAW | SDS |
REDIS_ENCODING_HT | 字典 |
REDIS_ENCODING_LINKEDLIST | 双向链表 |
REDIS_ENCODING_ZIPLIST | 压缩列表 |
REDIS_ENCODING_SKIPLIST | 跳表 |
REDIS_ENCODING_INTSET | 整数集合 |
使用object encoding 命令可以打印出 编码
类型和编码的搭配
类型 | 编码 | 对象 |
---|---|---|
string | int | 使用整数值实现的字符串对象 |
string | embstr | 使用embstrSDS实现的字符串对象 |
string | raw | 使用SDS实现的字符串对象 |
list | ziplist | 使用压缩列表实现的列表对象 |
list | linkedlist | 使用双向链表实现的列表对象 |
hash | ziplist | 使用压缩列表实现的哈希对象 |
hash | ht | 使用字典实现的哈希对象 |
set | intset | 使用整数集合实现的集合对象 |
set | ht | 使用字典实现的集合对象 |
zset | ziplist | 使用压缩列表实现的有序集合对象 |
zset | skiplist | 使用跳表和字典实现的有序集合对象 |
网友评论