相见时难别亦难,东风无力百花残。
--李商隐《无题》
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;