下面分别介绍Redis支持的4种数据类型。
- string(字符串)
string是最简单的类型,一个key对应一个value,支持的操作与Memcached支持的操作类似,但功能更加丰富。
Redis采用sdshdr和sds结构封装字符串,字符串相关的操作在源文件sds.h/sds.c中实现。
sdshdr数据结构定义如下:
- typedef char *sds;
- struct sdshdr {
- long len;
- long free;
- char buf[];
- };
list(双向链表)
list是一个列表结构,主要功能是push、pop、获取一个范围的所有值等。操作中的key可以理解为链表的名字。
对list的定义和实现在源文件adlist.h/adlist.c中进行,相关的数据结构定义如下:
- // list迭代器
- typedef struct listIter {
- listNode *next;
- int direction;
- } listIter;
- // list数据结构
- typedef struct list {
- listNode *head;
- listNode *tail;
- void *(*dup)(void *ptr);
- void (*free)(void *ptr);
- int (*match)(void *ptr, void *key);
- unsigned int len;
- listIter iter;
- } list;
- Setc(集合)
set是集合,与数学中的集合概念相似,相关操作包括添加删除元素、对多个集合求交并差等。操作中的key可以理解为集合的名字。
在源文件dict.h/dict.c中实现对hashtable的操作,数据结构定义如下:
- // dict中的元素项
- typedef struct dictEntry {
- void *key;
- void *val;
- struct dictEntry *next;
- } dictEntry;
- // dict相关配置函数
- typedef struct dictType {
- unsigned int (*hashFunction)(const void *key);
- void *(*keyDup)(void *privdata, const void *key);
- void *(*valDup)(void *privdata, const void *obj);
- int (*keyCompare)(void *privdata, const void *key1, const void *key2);
- void (*keyDestructor)(void *privdata, void *key);
- void (*valDestructor)(void *privdata, void *obj);
- } dictType;
- // dict定义
- typedef struct dict {
- dictEntry **table;
- dictType *type;
- unsigned long size;
- unsigned long sizemask;
- unsigned long used;
- void *privdata;
- } dict;
- // dict迭代器
- typedef struct dictIterator {
- dict *ht;
- int index;
- dictEntry *entry, *nextEntry;
- } dictIterator;
dict中table是dictEntry指针的数组,数组中每个成员为hash值相同的元素的单向链表。set是在dict的基础上实现的,指定了key的比较函数为dictEncObjKeyCompare,若key相等则不再插入。
zset(排序set)
zset是set的升级版本,在set的基础上增加了一个顺序属性,这一属性可以指定添加修改元素的时候,每次指定后,zset会自动按新的值调整顺序。zset 可被看作有两列数据的mysql表,一列数据存value,另一列数据存顺序。操作中的key可以理解为zset的名字。
- typedef struct zskiplistNode {
- struct zskiplistNode **forward;
- struct zskiplistNode *backward;
- double score;
- robj *obj;
- } zskiplistNode;
- typedef struct zskiplist {
- struct zskiplistNode *header, *tail;
- unsigned long length;
- int level;
- } zskiplist;
- typedef struct zset {
- dict *dict;
- zskiplist *zsl;
- } zset;
zset利用dict来维护key→value的映射关系,用zsl(zskiplist)保存value的有序关系。zsl实际是不稳定的多叉树,每条链上的元素从根节点到叶子节点保持升序排序。



