1.字符串,使用的是SDS动态字符串。
struct sdshdr{
int len;//buf中已使用字符串长度
int free;//记录buf中未使用的字节数量
char buf[];//字节数组用语保存字符串
}
可以减少字符串变化带来的内存从分配次数
2.链表
- linkedList
typedef struct listNode{
struct listNode *prev;
struct listNode *next;
void *value;
} listNode
typedef struct list{
listNode *head;
listNode *tail;
unsigned long len;//链表所包含的节点数量
void *(*dup)(void *ptr);//节点值复制函数
void *(*free)(void *ptr);//节点值释放函数
void (*match)(void *ptr,void *key);//节点值对比函数
} list
- zipList
3.字典
typedef struct dictht{
dictEntry **table;
unsigned long size;//哈希表大小
unsigned long size;//哈希表大小掩码,总是等于size-1
unsigned long used;//该哈希表已有节点数量
} dictht;
typedef struct dictEntry {
voie *key;
union {
void *val;
uint64_t u64;
int64_t s64;
} v;
struct dictEntry *next;
} dictEntry;
typedef struct dict {
//类型特定函数
dictType *type;
//私有数据
void *privdata;
//哈希表
dictht ht[2];
// rehash 索引
// 当rehash不在进行时,值为-1
in rehashidx; //rehashing not in progress if rehashidx == -1
} dict;
typedef struct dictType {
//计算哈希值的函数
...
//复制键的函数
...
//复制值的函数
...
//对比键的函数
...
//销毁键的函数
...
//销毁值的函数
...
} dictType;
4.跳跃表
typedef struct zskiplistNode (
//层
struct zskiplistLevel {
//前进进针
struct zskiplistNode *forward;
//跨度
unsigned int span;
) level[];
//后退指针
struct zskiplistNode *backward;
//分值
double score;
//成员对象
robj *obj;
} zskiplistNode;
typedef struct zskiplist (
//表头节点和表尾节点
struct zskiplistNode *header, *tail;
//表中节点的数量
unsigned long length;
//表中层徵最大的节点的层数
int level;
}zskiplist;
5.整数集合
typedef struct intset {
//编码方式
uint32_t encoding;
//集合包含的元素数量
uint32—t length;
// 保存元素的数组
int8_t contents[];
)intset;
6.redis对象
- 保存的浮点数会保存为字符串。当计算时再转为浮点数,计算完成后转为字符串保存
- int 执行append操作后转变为字符串
- 当列表对象同时满足下列两个条件时,列表对象使用ziplist编码,否则使用linkedlist编码
- 列表对象保存的所有字符串元素的长度小于64字节
- 列表对象保存的元素个数小于等于512个
(以上条件可在配置文件修改参数)
- 当哈希对象同时满足下列两条件时,哈希对象使用ziplist编码,否则使用hashtable编码(下面两条件参数可修改)
- 哈希对象保存的所有键值对字符串长度都小于64字节
- 保存的键值对数量小于512
- 集合对象编码为intset(整数集合)或者hashtable
- 当集合对象满足同时满足下列两条件时,使用inset编码(条件参数可修改)
- 集合对象保存的所有元素都是整数值
- 集合对象元素数量不超过512
- 引用计数实现垃圾回收
- redis使用定期删除和惰性删除两种策略的组合