Redis系列--数据类型
接下来,我们就来了解一下Redis的基础数据类型。
字符串:
Redis使用ANSI C语言编写,但是它并没有使用C语言中传统的字符串表示,而是重新定义了一种简单动态字符串(simple dynamic string)sds,将sds作为默认字符串表示。
typedef char *sds;struct sdshdr {unsigned int len; //记录buf中已使用的空间unsigned int free; //记录buf中空闲的空间char buf[]; //字符数组--传统的字符串表示,存放具体的数据};
sds比传统char数组的优势:
char数组采用N+1字符来记录N长度的字符串,为了获取N,需遍历数组,而sds获取len变量即可。
char数组容易内存溢出,sds通过free校验空间是否足够。
sds预留一部分空间,减少了修改字符串时内存重新分配的操作次数。
sds为二进制安全,即字符串中间可以有空字符'\0',而'\0'是char数据字符串的结束标记。所以sds可以保存音频、视频、图片、压缩数据等数据。
应用场景:
缓存,最常用的一种。
session,实现共享的一种方式。
链表:
可以保存多个数据,为双端链表。
typedef struct listNode {struct listNode *prev; //指向上一个节点struct listNode *next; //指向下一个节点void *value; //数据,具有多态性} listNode;typedef struct list {listNode *head; //指向表头listNode *tail; //指向表尾void *(*dup)(void *ptr); //指向复制函数void (*free)(void *ptr); //指向释放函数int (*match)(void *ptr, void *key); //指向匹配函数unsigned long len; //链表长度} list;
特点:双向、无环、有表头、有表尾、前后链接、数据可以重复、有序、可通过下标取值。
应用场景:
时间轴,比如微博、博客、评论等按照时间从近到远展示。
哈希表:
字典表,可以参考Redis系列--渐进式哈希这篇文章,里边有详细的介绍。
集合:
可以保存多个数据,与链表有所区别。
特点:元素无序、无重复、不能通过下标取值、支持交并查集合运算。
应用场景:
给人或者文章打标签及打关键字
有序集合:
通过zkiplist实现
typedef struct zskiplist {struct zskiplistNode *header, *tail;unsigned long length;int level;} zskiplist;typedef struct zset {dict *dict;zskiplist *zsl;} zset;
特点:元素有序、无重复、不能通过下标取值、支持交并查集合运算。
应用场景:
排行榜
PS:如有任何问题或疑问,请留言告诉我。
