Redis MODULE LOAD加载自定义模块扩展命令
Redis 自定义模块允许开发者使用 C 语言(或其他支持 C 接口的语言)编写新命令,并将其动态加载到 Redis 服务器中,从而突破原生命令的限制。本文将详细介绍从环境搭建到模块加载的完整流程。
第一阶段:环境准备与依赖安装
在编写和加载自定义模块之前,必须确保系统中已安装必要的编译工具和 Redis 服务。
-
检查 Redis 版本。
Redis 模块功能是在 4.0 版本引入的。执行以下命令确认版本号:redis-server -v如果版本低于 4.0,请先升级 Redis。
-
安装 编译工具链。
编写 Redis 模块通常使用 C 语言,因此需要安装 GCC 编译器和 Make 工具。在 Ubuntu/Debian 系统中,运行:sudo apt-get update sudo apt-get install build-essential在 CentOS/RedHat 系统中,运行:
sudo yum groupinstall "Development Tools" -
获取 Redis 模块头文件。
编写模块时必须依赖redismodule.h头文件。执行以下命令从 Redis 官方 GitHub 仓库下载该文件:wget https://raw.githubusercontent.com/redis/redis/unstable/src/redismodule.h将该文件保存在你即将编写代码的同一目录下。
第二阶段:编写自定义模块代码
我们将编写一个简单的模块,实现一个名为 HELLO.SIMPLE 的命令,该命令返回字符串 "Hello from custom module!"。
-
创建 源代码文件。
新建一个名为hellotest.c的文件,并输入以下代码:#include "redismodule.h" #include <string.h> /* 命令实现函数 */ int HelloSimple_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { /* 必须处理参数,即使不使用 */ REDISMODULE_NOT_USED(argv); REDISMODULE_NOT_USED(argc); /* 自动回收内存标志 */ RedisModule_AutoMemory(ctx); /* 向客户端返回字符串 */ RedisModule_ReplyWithSimpleString(ctx, "Hello from custom module!"); return REDISMODULE_OK; } /* 模块加载时的初始化函数 */ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { /* 处理模块加载时的参数(本例暂不使用) */ REDISMODULE_NOT_USED(argv); REDISMODULE_NOT_USED(argc); /* 注册模块名称和版本 */ if (RedisModule_Init(ctx, "hellotest", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) { return REDISMODULE_ERR; } /* 注册命令:HELLO.SIMPLE */ /* 参数:上下文, 命令名, 回调函数, 属性标志位, 首个键参数位置, 末尾键参数位置, 步数 */ if (RedisModule_CreateCommand(ctx, "hello.simple", HelloSimple_RedisCommand, "readonly", 0, 0, 0) == REDISMODULE_ERR) { return REDISMODULE_ERR; } return REDISMODULE_OK; } -
理解 核心函数逻辑。
RedisModule_OnLoad:这是模块的入口点。当 Redis 执行MODULE LOAD时会调用此函数。它负责初始化模块并注册新命令。RedisModule_CreateCommand:将具体的命令名字符串(如hello.simple)与对应的 C 函数(如HelloSimple_RedisCommand)绑定。RedisModule_ReplyWithSimpleString:用于向客户端返回执行结果。
第三阶段:编译动态链接库
编写完代码后,需要将其编译为 Redis 可以识别的动态链接库(即 .so 文件)。
-
执行 编译命令。
在hellotest.c所在目录下,运行以下命令:gcc -fPIC -shared -o hellotest.so hellotest.c-fPIC:生成位置无关代码,这是动态库所必需的。-shared:生成共享库文件。-o hellotest.so:指定输出文件名为hellotest.so。
-
验证 文件生成。
使用ls命令查看目录,确认生成了hellotest.so文件。
第四阶段:加载模块
加载模块有两种方式:一种是在 Redis 命令行中临时加载,另一种是通过配置文件持久化加载。
方式一:使用命令行动态加载 (临时)
这种方式适合开发调试,重启 Redis 后模块会失效。
-
启动 Redis 服务器。
确保有一个 Redis 实例正在运行:redis-server -
连接 Redis 客户端。
打开一个新的终端窗口,运行:redis-cli -
执行 加载命令。
在 CLI 中,输入MODULE LOAD命令并指定.so文件的绝对路径:MODULE LOAD /path/to/your/hellotest.so如果返回
OK,说明模块加载成功。
方式二:使用配置文件加载 (持久)
这种方式适用于生产环境,Redis 每次启动都会自动加载指定模块。
-
打开 Redis 配置文件。
通常位于/etc/redis/redis.conf或你的安装目录下。 -
添加 加载配置。
在文件中找到loadmodule部分,或者直接在文件末尾添加一行:loadmodule /path/to/your/hellotest.so -
重启 Redis 服务。
执行重启命令使配置生效:sudo systemctl restart redis或直接杀掉进程重启。
第五阶段:验证与测试
模块加载成功后,就可以像使用原生命令(如 GET、SET)一样使用自定义命令。
-
测试 自定义命令。
在redis-cli中,输入:hello.simple -
检查 返回结果。
如果一切正常,终端将显示:"Hello from custom module!" -
查看 模块列表。
若确认当前加载了哪些模块,运行:MODULE LIST输出将包含四个字段:模块 ID、名称、引擎版本和 API 版本。
| 模块ID (id) | 名称 | 引擎版本 (ver) | API 版本 |
|---|---|---|---|
| 0 | hellotest | 1 | 1 |
第六阶段:卸载模块与管理
当不再需要某个模块,或者需要更新模块代码重新编译时,需要将其卸载。
-
执行 卸载命令。
运行以下命令:MODULE UNLOAD hellotest参数是模块的名称(即代码中
RedisModule_Init的第一个参数),而不是文件名。 -
处理 卸载失败。
如果系统提示ERR Unloading failed,通常是因为当前有客户端正在阻塞使用该模块的命令,或者有脚本正在执行。关闭所有连接或脚本后再次尝试。 -
安全注意事项。
- 权限控制:由于模块拥有与 Redis 进程相同的系统权限,禁止加载来源不明的
.so文件,恶意模块可能导致数据泄露或系统被控。 - 参数清理:在代码中务必严格校验
argc和argv,防止因参数格式错误导致进程崩溃。
- 权限控制:由于模块拥有与 Redis 进程相同的系统权限,禁止加载来源不明的
通过以上步骤,你已成功掌握了 Redis 模块的编写、编译、加载及卸载全流程,可以利用 MODULE LOAD 灵活扩展 Redis 的功能。

暂无评论,快来抢沙发吧!