Redis模塊化基本介紹


概要

  1. Redis Modules System基本概念
  2. 基本應用
  3. 參考資料

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM