压缩列表

适用范围

压缩列表(ziplist)是一系列特殊编码的内存块, 它可以用节约内存的方式保存一系列字符串和整数值, 具体的信息请参考 《Redis 设计与实现》 的相关章节。

准备工作

  1. 将以下文件复制到目标文件夹:
    • endianconv.c
    • endianconv.h
    • fmacros.h
    • util.c
    • util.h
    • ziplist.c
    • ziplist.h
    • zmalloc.c
    • zmalloc.h
  2. 编辑 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();
}

完整源码

完整的测试代码可以在 这里ziplist 文件夹找到。

留言

comments powered by Disqus

Table Of Contents

Previous topic

整数集合

Next topic

MariaDB