相见时难别亦难,东风无力百花残。

                        --李商隐《无题》

redis数据类型包括:string、list、set、hash、sort set

1、string(1)存储的值可以是字符串、数字(2)最大能存储 512MB(3)常见的操作:set/get/incr/decr/incrby/decrby(4)底层存储结构:简单动态字符串(SDS: simple dynamic string)


struct sdshdr{    //当前存储的字节数     int len;    //剩余可存储的字节数     int free;    //存储字符串的字节数组     char buf[];}


2、列表--list(1)列表类型存储的值为字符串类型,可以实现简单消息队列功能(2)每个list可以存储 2^32 -1 个值(40多亿)(3)可以从队列头部(lpush)或尾部插入(rpush)(4)常见的操作:lpush/lpop/rpush/rpop/llen


typedef  struct listNode{       //上一个节点的指针       struct listNode *prev;       //下一个节点的指针       struct listNode *next;       //节点的值       void *value;  }listNode


3、集合--set(1)集合类型存储的值是无序的、不会重复(2)存储的是字符串类型数据(3)每个set 可以存储 2^32 -1 个值(40多亿)(4)是通过hash实现的,新增/删除/查找的复杂度均为O(1)(5)常见的操作:sadd/scard/smembers/sismember/srem(6)底层存储结构:intset(整数集合) 或 hashtable(字典的值为null)(7)当同时满足以下两个条件时才使用intset存储,否则使用hashtable存储:    (7.1)所有的元素都是整数    (7.2)元素个数不超过512


typedef struct intset{     //编码方式     uint32_t encoding;     //集合包含的元素数量     uint32_t length;     //保存元素的数组     int8_t contents[];}intset;

4、哈希--hash

(1)存储的每个元素是key->value对(2)每个 hash 可以存储 2^32 -1 键值对(40多亿)(3)常见的操作:hset/hmset/hget/hmget(4)底层存储结构:


typedef struct dictht{     //哈希表数组     dictEntry **table;     //当前哈希表大小     unsigned long size;     //哈希表大小掩码,用于计算索引值     //等于 size-1     unsigned long sizemask;     //该哈希表已有节点的数量     unsigned long used;}dictht


5、有序--sort set(1)存储的是字符串类型,每一个元素关联一个double类型的分数(2)每个zset 可以存储 2^32 -1 个值(40多亿)(3)元素按分数从小到大排序(4)常见的操作:zadd/zcard/zrange/zrangebyscore(5)底层存储的结构可以是ziplist或skiplist(6)当同时满足以下两个条件时才使用ziplist存储,否则使用skiplist存储:    (6.1)元素数量小于128(可配置)个    (6.2)每个元素长度小于64(可配置)字节时


//skiplist节点typedef struct zskiplistNode {     struct zskiplistLevel{           //前进指针           struct zskiplistNode *forward;           //跨度           unsigned int span;     }level[];      //后退指针     struct zskiplistNode *backward;     //分值     double score;     //成员对象     robj *obj; } zskiplistNodetypedef struct zskiplist{     //表头节点和表尾节点     structz skiplistNode *header, *tail;     //表中节点的数量     unsigned long length;     //表中层数最大的节点的层数     int level; }zskiplist;