redis基本类型
11redis基本类型
redis中的每个对象都由一个redisObject结构来表示:
/* * Redis 对象 */ typedef struct redisObject { // 类型 unsigned type:4; // 不使用(对齐位) unsigned notused:2; // 编码方式 unsigned encoding:4; // LRU 时间(相对于 server.lruclock) unsigned lru:22; // 引用计数 int refcount; // 指向对象的值 void *ptr; } robj; 复制代码
和保存数据有关的三个属性是type、encoding和ptr属性。
对象类型分为下边这几个,我们是用type命令可以查看对象类型
/* * 对象类型 */ #define REDIS_STRING 0 #define REDIS_LIST 1 #define REDIS_SET 2 #define REDIS_ZSET 3 #define REDIS_HASH 4 复制代码
对象的ptr指针指向对象的底层实现数据结构,这些数据结构由对象的encoding属性决定。
编码类型
/* * 对象编码 * * 像 String 和 Hash 这样的对象,可以有多种内部表示。 * 对象的 encoding 属性可以设置为以下域的任意一种。 */ #define REDIS_ENCODING_RAW 0 /* Raw representation 简单动态字符串*/ #define REDIS_ENCODING_INT 1 /* Encoded as integer long类型的整数*/ #define REDIS_ENCODING_HT 2 /* Encoded as hash table 字典*/ #define REDIS_ENCODING_ZIPMAP 3 /* Encoded as zipmap 压缩字典*/ #define REDIS_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list 双端链表*/ #define REDIS_ENCODING_ZIPLIST 5 /* Encoded as ziplist 压缩列表*/ #define REDIS_ENCODING_INTSET 6 /* Encoded as intset 整数集合*/ #define REDIS_ENCODING_SKIPLIST 7 /* Encoded as skiplist 跳跃表和字典*/ #define REDIS_ENCODING_EMBSTR 8 /* Embedded sds string encoding embstr编码的简单动态字符串*/ 复制代码
可以通过object encoding命令查看数据库键的值对象的编码
通过encoding属性来设定对象所使用的编码,而不是为特定类型的对象关联一种固定的编码,极大提升了redis的灵活性和效率,根据不同的使用场景来为对象设置不同的编码
不同数据结构的编码方式:
类型 | 编码 | 对象 |
---|---|---|
REDIS_STRING | REDIS_ENCODING_INT | 使用整数值实现的字符串对象 |
REDIS_ENCODING_EMBSTR | 使用embstr编码的简单动态字符串实现的字符串对象 | |
REDIS_ENCODING_RAW | 使用简单动态字符串实现的字符串对象 | |
REDIS_LIST | REDIS_ENCODING_ZIPLIST | 使用压缩列表实现的列表对象 |
REDIS_ENCODING_LINKEDLIST | 使用双端链表实现的列表对象 | |
REDIS_HASH | REDIS_ENCODING_ZIPLIST | 使用压缩列表实现的哈希对象 |
REDIS_ENCODING_HT | 使用字典实现的哈希对象 | |
REDIS_SET | REDIS_ENCODING_INTSET | 使用整数集合实现的集合对象 |
REDIS_ENCODING_HT | 使用字典实现的集合对象 | |
REDIS_ZSET | REDIS_ENCODING_ZIPLIST | 使用压缩列表实现的有序集合对象 |
REDIS_ENCODING_SKIPLIST | 使用跳跃表和字典实现的有序集合对象 |
作者:周杰倫本人
链接:https://juejin.cn/post/7025822456627593230