当数据库中一个列表键只包含少量数据并且每个列表项是小整数值或者短的字符串,redis就用ziplist
来保存。
这里需要注意ziplist 是用连续的内存来保存值.
redis 中通过ziplist来新建一个ziplist,其实现如下:
unsigned char *ziplistNew(void) {
// ZIPLIST_HEADER_SIZE 是表头大小
unsigned int bytes = ZIPLIST_HEADER_SIZE+1;
//为ziplist 分配空间,从这里可以看到ziplist 占用的是一段连续的内存
unsigned char *zl = zmalloc(bytes);
// 初始化表属性
ZIPLIST_BYTES(zl) = intrev32ifbe(bytes);
ZIPLIST_TAIL_OFFSET(zl) = intrev32ifbe(ZIPLIST_HEADER_SIZE);
ZIPLIST_LENGTH(zl) = 0;
//设置ziplist的表尾
zl[bytes-1] = ZIP_END;
// 返回表尾
return zl;
}
我们看一个ziplist 保存值的函数
static void zipSaveInteger(unsigned char *p, int64_t value, unsigned char encoding) {
int16_t i16;
int32_t i32;
int64_t i64;
// 可以看到根据encoding 方式的不同将值保存为不同的类型
if (encoding == ZIP_INT_8B) {
((int8_t*)p)[0] = (int8_t)value;
} else if (encoding == ZIP_INT_16B) {
i16 = value;
memcpy(p,&i16,sizeof(i16));
memrev16ifbe(p);
} else if (encoding == ZIP_INT_24B) {
i32 = value<<8;
memrev32ifbe(&i32);
memcpy(p,((uint8_t*)&i32)+1,sizeof(i32)-sizeof(uint8_t));
} else {
assert(NULL);
}
}
redis的ziplist
最新推荐文章于 2024-06-18 15:59:25 发布