• 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

  • 相关阅读:
    Anagram
    HDU 1205 吃糖果(鸽巢原理)
    Codeforces 1243D 0-1 MST(补图的连通图数量)
    Codeforces 1243C Tile Painting(素数)
    Codeforces 1243B2 Character Swap (Hard Version)
    Codeforces 1243B1 Character Swap (Easy Version)
    Codeforces 1243A Maximum Square
    Codeforces 1272E Nearest Opposite Parity(BFS)
    Codeforces 1272D Remove One Element
    Codeforces 1272C Yet Another Broken Keyboard
  • 原文地址:https://www.cnblogs.com/jabnih/p/7241866.html
Copyright © 2020-2023  润新知