Redis-module 初体验

Redismodule 是 Redis 4.0 加入的。Redis modules 可以使用外部模块扩展 Redis 功能,并以与内核本身内部功能类似的速度快速实现新的 Redis 命令。

Redis modules 是动态库,可以在启动时或使用 MODULE LOAD 命令加载到 Redis 中(最好是同时设置)。Redis 以单个C头文件 redismodule.h 的形式导出C API。模块是用C编写的,但是也可以使用C ++或其他具有C绑定功能的语言。

modules 被设计用来将其加载到不同版本的 Redis 中,因此,无需设计或重新编译给定的模块即可与特定版本的 Redis 一起运行。因此,该模块将使用特定的API版本注册到Redis核心。当前的API版本为“ 1”。

中文官方文档 http://www.redis.cn/topics/modules-intro.html

1. 查询模块命令

module list

2. 加载

就像上面提到的加载 modules 有两种方法:

  1. 使用配置文件的方式,把以下代码放入你的配置文件中:
loadmodule /path/to/mymodule.so

/path/to/mymodule.so:表示你文件在主机上的的路径

  1. 命令行的方式,命令如下:
module load /path/to/mymodule.so

注意:命令行加载的话重启会失效

3. 卸载

卸载更简单,命令如下:

module unload module_name

注意:module unload 后面跟的就不是文件地址了,而是模块的名字。使用 module list 可以查看模块名称

4. 实现自己的 module

  1. 第一步,编写 module,我用的官方的例子,文件名我用的是 mymodule.c。你可以和我一样,以免运行下面命令时出现错误。
#include "redismodule.h"
#include 

int HelloworldRand_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
    RedisModule_ReplyWithLongLong(ctx,rand());
    return REDISMODULE_OK;
}

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
    if (RedisModule_Init(ctx,"helloworld",1,REDISMODULE_APIVER_1)
        == REDISMODULE_ERR) return REDISMODULE_ERR;

    if (RedisModule_CreateCommand(ctx,"helloworld.rand",
        HelloworldRand_RedisCommand, "readonle",0,0,1) == REDISMODULE_ERR)
        return REDISMODULE_ERR;

    return REDISMODULE_OK;
}

以上的代码表示当你运行 helloworld.rand 命令时返回一个随机数。

解释:

  • RedisModule_OnLoad 方法是每个 module 文件中必须存在的。它是要初始化的模块,注册其命令以及可能使用的其他私有数据结构的入口点。
  • RedisModule_Init 操作便是你要定义的模块名。
  • RedisModule_CreateCommand 操作表示定义的方法的名称,这里使用 helloworld.rand 命令定义 HelloworldRand_RedisCommand 方法。

    Redis 官方建议使用模块名 + 方法的的方式定义你的命令

  1. 加入 redismodule.h
    这是官方的C文件。放到和 #include "redismodule.h" 相应的目录下。它里面包含了一些官方提供的方法,例如:
  • RedisModule_Call:调用 Redis 命令
  • RedisModule_CreateStringFromLongLong:把数字转换为字符串
    ...
    以上方法在官方文档中都有解释。
  1. 编译
    我编译的时候干开始出了一点小问题。原因是由于官方给的示例可能太老了,没有即时更新。RedisModule_CreateCommand 命令在示例中只给了三个参数,但是 redismodule.h 中却有 7个参数,导致参数不匹配。如果你也出现了这个情况,可以直接使用第一步给出的示例。
执行编译
  1. gcc -fPIC -std=gnu99 -c -o mymodule.o mymodule.c
    把 mymodule.c` 编译成 mymodule.o

  2. ld -o mymodule.so mymodule.o -shared -Bsymbolic -lc
    把 mymodule.o 编译成 mymodule.so

  3. 加载
    我们这里暂且使用命令行的方式加载,运行命令:

module load /modules/mymodule.so

/modules/mymodule.so 表示你的文件路径,请自行修改

  1. 测试
    打开 reids 命令行,运行以下命令:
helloworld.rand

如果返回随机数,说明成功。

5. 一些好用的 modules

https://redis.io/modules
这是官方的一些 module,我比较感兴趣的是 RedisSearch
https://github.com/RedisLabsModules/redex
这个是 Redis 命令的扩展。它有很多有意思又好用的命令,比如批量删除命令 PDEL,这个太好用了。

Conclusion

Redis module 真的是一个非常棒的功能。我们可以利用 Redis 高性能的框架实现我们自己的特殊的功能,如果官方提供的 api 不能满足我们的要求,我们也可以修改 module.c 文件添加自己的函数。

比较可惜的是我们用的是 aliyun 的 Redis,它现在并不支持加载 module 的功能。另外我对c、c++不太了解,如果有错误的地方请大家指正。

你可能感兴趣的:(Redis-module 初体验)