面试题答案
一键面试Redis压缩列表节点数据结构设计
-
字段含义
- 前一个节点长度(prevlen):记录前一个节点的长度。如果前一个节点长度小于254字节,prevlen使用1字节表示;如果大于等于254字节,prevlen使用5字节表示,第一个字节为254(0xfe),后面4字节表示实际长度。
- 自身长度(encoding):表示当前节点内容的编码方式及长度信息。根据编码方式不同,可能是1 - 3字节,用于区分内容是字符串还是整数以及对应的长度。
- 节点内容(content):存放实际的数据,根据encoding字段决定是字符串还是整数。
-
C语言实现关键代码片段
// 假设已定义一些宏,如ZIP_STR_06B等用于编码
// 定义压缩列表节点
typedef struct zlentry {
// 前一个节点长度
unsigned int prevrawlensize;
unsigned int prevrawlen;
// 自身长度编码
unsigned int lensize;
unsigned int len;
// 编码类型
unsigned int encoding;
// 指向内容的指针
unsigned char *p;
} zlentry;
// 获取prevlen长度
static unsigned int ziplistPrevLenByte(unsigned int prevlen) {
return prevlen < 254 ? 1 : 5;
}
// 获取encoding长度
static unsigned int ziplistEncodingByte(unsigned int encoding) {
if (encoding < ZIP_STR_06B) {
return 1;
} else if (encoding < ZIP_STR_14B) {
return 2;
} else {
return 3;
}
}