redis 所有值对象在内部都定义为 redisObject
typedef struct redisObject{ //类型 unsigned type:4; //编码 unsigned encoding:4; //指向底层数据结构的指针 void *ptr; //引用计数器 int refCount; //最后一次的访问时间 unsigned lru: }
redis字符串对象(SDS)
struct sdshdr{ //记录buf数组中已使用字节的长度 int len; //记录buf数组中剩余空间的长度 int free; //字节数组,用于存储字符串 char buf[]; };
intset
typedef struct intset{ //编码方式 uint32_t encoding; //元素数量 uint32_t length; //存储元素的数组 int8_t contents[]; }
ziplist
type struct ziplist{ //整个压缩列表的字节数 uint32_t zlbytes; //记录压缩列表尾节点到头结点的字节数,直接可以求节点的地址 uint32_t zltail_offset; //记录了节点数,有多种类型,默认如下 uint16_t zllength; //节点 列表节点 entryX;
linkedlist
type struct list{ //表头节点 listNode *head; //表尾节点 listNode *tail; //包含的节点总数 unsigned long len; //一些操作函数 dup free match... };
hashtable
typedef struct dictht{ //哈希表数组 dictEntry **table; //哈希表大小 unsigned long size; //哈希表掩码,总是等于size-1,存储时计算索引值 unsigned long sizemask; //已有元素数量 unsigned long used; }
skiplist
typedef struct zskiplistNode {
//层
struct zskiplistLevel {
//前进指针
struct zskiplistNode *forward;
//跨度
unsigned int span;
} level[];
//后退指针
struct zskiplistNode *backward;
//分值
double score;
//成员对象
robj *obj;
} zskiplistNode;
typedef struct zskiplist {
//头结点
zskiplistNode *head;
//尾节点
zskiplistNode *tail;
//当前最大层高
int maxLevel;
//跳表长度
int length;
//跳表中的所有键值对
map<String,zskiplistNode*> ht;
}
一、字符串(string 最大512M)
内部编码:(查看内部编码命令 object encode 键值)
int:8个字节的长整形
embstr:小于等于某个值(39个)字节的字符串
raw:大于某个值(39个)字节的字符串
二、哈希(hash)
内部编码:
ziplist:当元素个数小于某个值(hash-max-ziplist-entries 默认512),同时每个元素占用内存都小于某个值(hash-max-ziplist-value 默认64字节)redis使用ziplist节省内存
hashtable:不满足ziplist的条件就用hashtable
三、列表(list)
内部编码:
ziplist:当元素个数小于某个值(list-max-ziplist-entries 默认512),同时每个元素占用内存都小于某个值(list-max-ziplist-value 默认64字节)redis使用ziplist节省内存
linkedlist:不满足ziplist的条件就用hashtable
四、集合(set)
内部编码:
intset:当集合中的元素都是整数且元素个数小于某个值(set-max-intset-entries 默认512)时 ,使用intset节省内存
hashtable:不满足intset的条件就用hashtable
五、有序集合(zset)
内部编码:
ziplist:当元素个数小于某个值(zset-max-ziplist-entries 默认128),同时每个元素占用内存都小于某个值(zset-max-ziplist-value 默认64字节)redis使用ziplist节省内存
skiplist:不满足ziplist的条件就用skiplist