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/redis
Redis導出了redismodule.h頭文件,經過實現該頭文件相關API函數,而後編譯爲so動態庫,便可。api
能夠在配置文件中使用loadmodule指明,也能夠在運行時使用命令動態加載(MODULE LOAD)。框架
實現RedisModule_OnLoad方法,在裏面調用RedisModule_Init初始化模塊,而後使用RedisModule_CreateCommand建立命令。dom
最後編譯: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; }
每個Redis Module裏面都必需要有該方法,模塊加載的時候會調用,該方法用於初始化模塊的相關信息。如建立Redis自定義命令等。通常來講,都是以:《模塊名.方法》 來進行命名。如(SIMPLE.RAND)
API原型:
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc);
日誌
在RedisModule_OnLoad方法裏面調用,必須第一個調用,由於要初始化一些信息。出錯返回REDISMODULE_ERR
API 原型:
int RedisModule_Init(RedisModuleCtx *ctx, const char *modulename, int module_version, int api_version);
code
註冊自定義方法。
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);
ip
注:
Strflags能夠取值:
write readonly admin deny-oom deny-script allow-loading pubsub random allow-stale no-monitor fast getkeys-api no-cluster
Redis官方文檔:https://redis.io/topics/modules-intro