在Redis modules的实现自己的数据类型

注册类型

  Redis modules 能够支持使用高级API(RedisModule_Call)或者 低级API 去直接访问操作 Redis 内置的数据结构。通过使用这些能力我们能够在已存的Redis数据结构上建立一个新的抽象,或者使用 string DMA来把一个Redis module 的数据结构编码成 Redis的string,有了这些方法,我们就有可能使用Redis Module在Redis 内核中创建了一个新数据结构。然而,还有一些更多需要思考的点,不像前面讲的那么简单,接下来会详细介绍。

概况注册数据类型的步骤

  注册一个数据类型主要由以下几步构成
1. 需要某种新的数据类型与其配套操作它的命令的实现
2. 一系列回调函数比如: RDB saving , RDB loading , AOF rewriting , release value (与该key相关的value),相应的hash函数实现(需要实现一个用来hash该数据类型的函数,当Redis使用 DEBUG DIGEST 命令的时候会将所有的key-value 进行hash)。
3. 注册的类型名是一个在所有模块中都独一无二的名字。注意这个类型名长9个字符,由A-Z 、a-z、0-9、_ 、– 构成,如果名字不是恰好9个字符注册失败。
4. 一个编码version,它用来被持久化到RDB文件中标识一个module相应的数据version号。
  当我们第一次看到这里的时候觉得要处理RDB load、save 和 AOF rewrite 感觉很麻烦,但是Redis 提供了非常高级的API供我们使用,我们不必去担心 I/O细节,实际上实现一个 新的数据类型在Redis中是一个新简单的任务
  在Redis源码中的/modules/hellotype.c 文件中有很好的列子,它很通俗易懂,大家可以去看看

注册一个数据类型

  为了在Redis内核中注册一个数据类型,我们需要在我们实现的module中去定义一个全局变量,用它去保存我们注册的数据类型。RedisModule_CreateDataType API将会返回我们注册的数据类型的一个指针,到时候这个指针就会使用我们定义的那个全局变量来保存。

static RedisModuleType *MyType;
#define MYTYPE_ENCODING_VERSION 0
int RedisModule_OnLoad(RedisModuleCtx *ctx) {
RedisModuleTypeMethods tm = {
    .version = REDISMODULE_TYPE_METHOD_VERSION,
    .rdb_load = MyTypeRDBLoad,
    .rdb_save = MyTypeRDBSave,
    .aof_rewrite = MyTypeAOFRewrite,
    .free = MyTypeFree
};
    MyType = RedisModule_CreateDataType(ctx, "MyType-AZ",
    MYTYPE_ENCODING_VERSION, &tm);
    if (MyType == NULL) return REDISMODULE_ERR;
}

  如上,这个API在注册一个新的数据类型的时候是必须要被调用的。在注册的时候,我们给这个API传递了大量的有关相应命令的函数指针作为参数(tm参数)。上面tm结构体里的函数指针是必须传的,然而除了 .digest 与 .mem_usage 这俩个是可选的,并且目前大多数情况下是不支持modules自己去实现它,所以我们可以忽略它们俩个。虽然是忽略,但是也必须给相应变量赋值上NULL,否则tm结构会失效

static RedisModuleType *MyType;
#define MYTYPE_ENCODING_VERSION 0

int RedisModule_OnLoad(RedisModuleCtx *ctx) {
RedisModuleTypeMethods tm = {
    .version = REDISMODULE_TYPE_METHOD_VERSION,
    .rdb_load = MyTypeRDBLoad,
    .rdb_save = MyTypeRDBSave,
    .aof_rewrite = MyTypeAOFRewrite,
    .free = MyTypeFree
};

    MyType = RedisModule_CreateDataType(ctx, "MyType-AZ",
    MYTYPE_ENCODING_VERSION, &tm);
    if (MyType == NULL) return REDISMODULE_ERR;
}

  上面的encver参数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值