0 Comments

Redis的数据结构

发布于:2013-01-14  |   作者:广州网站建设  |   已聚集:人围观

下面分别介绍Redis支持的4种数据类型。


  1. string(字符串) 

string是最简单的类型,一个key对应一个value,支持的操作与Memcached支持的操作类似,但功能更加丰富。

Redis采用sdshdr和sds结构封装字符串,字符串相关的操作在源文件sds.h/sds.c中实现。

sdshdr数据结构定义如下:


  1. typedef char *sds;  
  2. struct sdshdr {  
  3. long len;  
  4. long free;  
  5. char buf[];  
  6. };  

list(双向链表)

list是一个列表结构,主要功能是push、pop、获取一个范围的所有值等。操作中的key可以理解为链表的名字。

对list的定义和实现在源文件adlist.h/adlist.c中进行,相关的数据结构定义如下:


  1.  // list迭代器  
  2. typedef struct listIter {  
  3. listNode *next;  
  4. int direction;  
  5. } listIter;  
  6. // list数据结构  
  7. typedef struct list {  
  8. listNode *head;  
  9. listNode *tail;  
  10. void *(*dup)(void *ptr);  
  11. void (*free)(void *ptr);  
  12. int (*match)(void *ptr, void *key);  
  13. unsigned int len;  
  14. listIter iter;  
  15. } list;  
  16. Setc(集合)  

set是集合,与数学中的集合概念相似,相关操作包括添加删除元素、对多个集合求交并差等。操作中的key可以理解为集合的名字。

在源文件dict.h/dict.c中实现对hashtable的操作,数据结构定义如下:


  1. // dict中的元素项  
  2. typedef struct dictEntry {  
  3. void *key;  
  4. void *val;  
  5. struct dictEntry *next;  
  6. } dictEntry;  
  7. // dict相关配置函数  
  8. typedef struct dictType {  
  9. unsigned int (*hashFunction)(const void *key);  
  10. void *(*keyDup)(void *privdata, const void *key);  
  11. void *(*valDup)(void *privdata, const void *obj);  
  12. int (*keyCompare)(void *privdata, const void *key1, const void *key2);  
  13. void (*keyDestructor)(void *privdata, void *key);  
  14. void (*valDestructor)(void *privdata, void *obj);  
  15. } dictType;  
  16. // dict定义  
  17. typedef struct dict {  
  18. dictEntry **table;  
  19. dictType *type;  
  20. unsigned long size;  
  21. unsigned long sizemask;  
  22. unsigned long used;  
  23. void *privdata;  
  24. } dict;  
  25. // dict迭代器  
  26. typedef struct dictIterator {  
  27. dict *ht;  
  28. int index;  
  29. dictEntry *entry, *nextEntry;  
  30. } dictIterator;  

dict中table是dictEntry指针的数组,数组中每个成员为hash值相同的元素的单向链表。set是在dict的基础上实现的,指定了key的比较函数为dictEncObjKeyCompare,若key相等则不再插入。

zset(排序set)

zset是set的升级版本,在set的基础上增加了一个顺序属性,这一属性可以指定添加修改元素的时候,每次指定后,zset会自动按新的值调整顺序。zset 可被看作有两列数据的mysql表,一列数据存value,另一列数据存顺序。操作中的key可以理解为zset的名字。


  1. typedef struct zskiplistNode {  
  2. struct zskiplistNode **forward;  
  3. struct zskiplistNode *backward;  
  4. double score;  
  5. robj *obj;  
  6. } zskiplistNode;  
  7. typedef struct zskiplist {  
  8. struct zskiplistNode *header, *tail;  
  9. unsigned long length;  
  10. int level;  
  11. } zskiplist;  
  12. typedef struct zset {  
  13. dict *dict;  
  14. zskiplist *zsl;  
  15. } zset;  

 

zset利用dict来维护key→value的映射关系,用zsl(zskiplist)保存value的有序关系。zsl实际是不稳定的多叉树,每条链上的元素从根节点到叶子节点保持升序排序。
标签:
飞机