压缩列表(ziplist)是一系列特殊编码的内存块, 它可以用节约内存的方式保存一系列字符串和整数值, 具体的信息请参考 《Redis 设计与实现》 的相关章节。
endianconv.c
endianconv.h
fmacros.h
util.c
util.h
ziplist.c
ziplist.h
zmalloc.c
zmalloc.h
zmallo.c
,将其中的 #include "config.h"
语句删去。以下程序对 ziplist
模块进行了测试,
包括创建并释放一个空白的 ziplist
,
以及对 ziplist
进行添加、删除和查找操作:
// main.c
#include <assert.h> // load assert()
#include <stdlib.h> // load NULL
#include "ziplist.h"
void test_create_and_destroy_ziplist(void)
{
unsigned char *zl = ziplistNew();
assert(
zl != NULL
);
zfree(zl);
}
void test_add_delete_and_find_node_wtih_ziplist(void)
{
unsigned char *zl = ziplistNew();
// add first node
zl = ziplistPush(zl, (unsigned char*)"hello", 5, ZIPLIST_TAIL);
assert(
ziplistLen(zl) == 1
);
assert(
ziplistFind(zl, (unsigned char*)"hello", 5, 0) != NULL)
;
// add second node
zl = ziplistPush(zl, (unsigned char*)"moto", 4, ZIPLIST_TAIL);
assert(
ziplistLen(zl) == 2
);
assert(
ziplistFind(zl, (unsigned char*)"moto", 4, 0) != NULL);
// delete first node
unsigned char* node_p = ziplistFind(zl, (unsigned char*)"hello", 5, 0);
zl = ziplistDelete(zl, &node_p);
assert(
ziplistFind(zl, (unsigned char*)"hello", 5, 0) == NULL
);
assert(
ziplistLen(zl) == 1
);
// release memory
zfree(zl);
}
void main(void)
{
test_create_and_destroy_ziplist();
test_add_delete_and_find_node_wtih_ziplist();
}