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/redis

2. 基本應用

Redis導出了redismodule.h頭文件,經過實現該頭文件相關API函數,而後編譯爲so動態庫,便可。api

2.1 加載方式

能夠在配置文件中使用loadmodule指明,也能夠在運行時使用命令動態加載(MODULE LOAD)。框架

2.2 模塊化命令

  • MODULE LOAD
  • MODULE LIST
  • MODULE UNLOAD

2.3 開發

2.3.1 示例

實現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;
}

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);code

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);ip

注:
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

相關文章
相關標籤/搜索