概要
- Redis Modules System基本概念
- 基本應用
- 參考資料
1. Redis Modules System基本概念
Redis Modules System是4.0出現一大改動點,使得可以通過外部模塊對Redis進行功能性擴展。 Redis的模塊采用的是動態鏈接庫的方式,可以啟動的時候加載,也可以在運行時加載(MODULE LOAD),在Linux系統里面,可以通過dlopen,dlsym等實現動態加載庫,在業務系統里面,經常用於將業務代碼和框架代碼進行分離,以實現插件化開發。在Redis里面也是同樣的道理。要實現分離,首先需要的是初始化,以便讓框架可以找到對應的方法,這就需要進行注冊,Redis通過RedisModule_Init方法進行注冊模塊,和RedisModule_CreateCommand注冊自定義方法。
Redis進行模塊化,可以擴大Redis的生態圈,滿足一些擴展性功能需求,現在就有一個Hub用於收集Redis模塊的插件。如:http://redismodules.com/
2. 基本應用
Redis導出了redismodule.h頭文件,通過實現該頭文件相關API函數,然后編譯為so動態庫,即可。
2.1 加載方式
可以在配置文件中使用loadmodule指明,也可以在運行時使用命令動態加載(MODULE LOAD)。
2.2 模塊化命令
- MODULE LOAD
- MODULE LIST
- MODULE UNLOAD
2.3 開發
2.3.1 示例
實現RedisModule_OnLoad方法,在里面調用RedisModule_Init初始化模塊,然后使用RedisModule_CreateCommand創建命令。
最后編譯:gcc simple.c –fPIC –shared -o simple.so

客戶端連接,動態加載:

服務端輸出日志:

執行命令:

基於4.0.1 stable版本開發的:
#include "redismodule.h"
#include <stdlib.h>
int SimpleRand_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,"simplemodule",1,REDISMODULE_APIVER_1)
== REDISMODULE_ERR) return REDISMODULE_ERR;
// (RedisModuleCtx *ctx, const char *name, RedisModuleCmdFunc cmdfunc, const char *strflags, int firstkey, int lastkey, int keystep);
if (RedisModule_CreateCommand(ctx,"simple.rand",
SimpleRand_RedisCommand, "readonly", 1, 1, 1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
return REDISMODULE_OK;
}
2.4 API說明
RedisModule_OnLoad
每一個Redis Module里面都必須要有該方法,模塊加載的時候會調用,該方法用於初始化模塊的相關信息。如創建Redis自定義命令等。一般來說,都是以:《模塊名.方法》 來進行命名。如(SIMPLE.RAND)
API原型:
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc);
RedisModule_Init
在RedisModule_OnLoad方法里面調用,必須第一個調用,因為要初始化一些信息。出錯返回REDISMODULE_ERR
API 原型:
int RedisModule_Init(RedisModuleCtx *ctx, const char *modulename, int module_version, int api_version);
RedisModule_CreateCommand
注冊自定義方法。
API原型:
int RedisModule_CreateCommand (RedisModuleCtx *ctx, const char *name, RedisModuleCmdFunc cmdfunc, const char *strflags, int firstkey, int lastkey, int keystep);
自定義API原型:
int mycommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc);
注:
Strflags可以取值:
write readonly admin deny-oom deny-script allow-loading pubsub random allow-stale no-monitor fast getkeys-api no-cluster
3. 參考資料
Redis官方文檔:https://redis.io/topics/modules-intro
