redis数据类型
源码
类型
/* The actual Redis Object */
#define OBJ_STRING 0 /* String object. */
#define OBJ_LIST 1 /* List object. */
#define OBJ_SET 2 /* Set object. */
#define OBJ_ZSET 3 /* Sorted set object. */
#define OBJ_HASH 4 /* Hash object. */
结构
typedef struct redisObject {
//类型
unsigned type:4;
//类型编码
unsigned encoding:4;
//实用LRU算法计算相对server.lruclock的LRU时间
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
* and most significant 16 bits access time). */
//引用计数 *
int refcount;
//指向底层数据实现的指针
void *ptr;
} robj;
redisObject结构中的type属性记录对象的属性 可以用type命令查看
/* Objects encoding. Some kind of objects like Strings and Hashes can be
* internally represented in multiple ways. The 'encoding' field of the object
* is set to one of this fields for this object. */
#define OBJ_ENCODING_RAW 0 /* Raw representation */
#define OBJ_ENCODING_INT 1 /* Encoded as integer */
#define OBJ_ENCODING_HT 2 /* Encoded as hash table */
#define OBJ_ENCODING_ZIPMAP 3 /* Encoded as zipmap */
#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define OBJ_ENCODING_INTSET 6 /* Encoded as intset */
#define OBJ_ENCODING_SKIPLIST 7 /* Encoded as skiplist */
#define OBJ_ENCODING_EMBSTR 8 /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */
#define OBJ_ENCODING_STREAM 10 /* Encoded as a radix tree of listpacks */
redisObject结构中的ptr指针指向对象底层实现的数据结构,而这些数据结构由redisObject中的encoding决定。用encoding记录不同对象使用的不同编码类型,而不同的编码类型就代表了不同的数据结构,可以使用OBJECT ENCODING命令查看
字符串对象
如果字符串是整数会按整数存储
如果字符串存的字符串值并且 长度大于32
如果字符串存的字符串值并且 长度小于等于32
列表对象
可以在配置文件设置大小
哈希对象
编码可以是ziplist 或者 hashtable
ziplist 的编码是 添加的键值对 总是放到一起,添加到ziplist最后面
用hashtable 编码,使用字典结构存储 键值对都是字符串对象
可以在配置文件设置大小
集合对象
底层 intset 或者hashtable
可以在配置文件设置大小
有序集合
/* ZSETs use a specialized version of Skiplists */
typedef struct zskiplistNode {
sds ele;
double score;
struct zskiplistNode *backward;
struct zskiplistLevel {
struct zskiplistNode *forward;
unsigned long span;
} level[];
} zskiplistNode;
typedef struct zskiplist {
struct zskiplistNode *header, *tail;
unsigned long length;
int level;
} zskiplist;
typedef struct zset {
dict *dict;
zskiplist *zsl;
} zset;
编码可以是ziplist 或者skiplist
使用ziplist 按分值从小到大排序,小的元素放到表头
skiplist中有zset结构包含一个字典和跳跃表 字典记录了每个成员到分值的映射,通过分值来排序
可以通过配置来改变 元素大小