概要

  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

Redis模块化基本介绍的更多相关文章

  1. C语言模块化编译介绍

    C语言模块化编译介绍 模块化编程的概念 所谓模块化变成(多文件开发),就是多文件(.c文件)编程,一个.c文件和一个.h文件可以被称为一个模块. 头文件开发的注意事项: 1)头文件中可以和C程序一样引 ...

  2. Redis常用数据类型介绍、使用场景及其操作命令

    Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...

  3. Redis --> Redis的接口介绍及使用

    Redis的接口介绍及使用 Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型.Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然 ...

  4. redis锁机制介绍与实例

    转自:https://m.jb51.net/article/154421.htm 今天小编就为大家分享一篇关于redis锁机制介绍与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要 ...

  5. [原]Redis详细配置介绍

    Redis详细配置介绍 # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 ...

  6. Redis主从复制简单介绍

    由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基本一致! (精读阅读本篇可能花费您15分钟,略读需5分 ...

  7. 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用

    消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...

  8. Redis学习01——介绍与搭建环境

    Redis学习01介绍与搭建环境一简介二yum配置已经配置了的可以跳过三安装gcc四安装redis1 上传Redis到linux中2 解压到usrlocal下3 编译redis4 安装redis5 拷 ...

  9. Redis的简单介绍及在Windows下环境搭建

    简单介绍 1,Redis是什么 最直接的还是看官方的定义吧. Redis is an open source (BSD licensed), in-memory data structure stor ...

随机推荐

  1. python的文件操作file:(内置函数,如seek、truncate函数)

    file打开文件有两种方式,函数用file()或者open().打开后读入文件的内容用read()函数,其读入是从文件当前指针位置开始,所以需要控制指针位置用: 一.先介绍下file读入的控制函数: ...

  2. javascript之BOM浏览器对象模型引入

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 防止Android程序被系统kill掉的处理方法

    转载请注明出处:http://blog.csdn.net/cuiran/article/details/38851401 目前遇到一个问题程序需要一直运行,并显示在最前端,但是运行一段时间发现会被系统 ...

  4. android官方技术文档翻译——工具属性

    本文译自androd官方技术文档<Tools Attributes>:http://tools.android.com/tech-docs/tools-attributes 本文地址:ht ...

  5. Java应用服务器Resin

    Resin是CAUCHO公司(http://www.caucho.com/)的产品,是一个非常流行的支持servlets 和jsp的引擎,速度非常快.Resin本身包含了一个支持HTTP/1.1的WE ...

  6. ISLR系列:(2)分类 Logistic Regression & LDA & QDA & KNN

       Classification 此博文是 An Introduction to Statistical Learning with Applications in R 的系列读书笔记,作为本人的一 ...

  7. Protobuf-java maven配置

    Protobuf-java maven配置 1. maven pom片断 <!-- protobuf-java for maven plugin http://stackoverflow.com ...

  8. (二十一)即时通信的聊天气泡的实现II

    一些优化: 禁止TableView的点击: self.tableView.allowsSelection = NO; 合并相同的时间: 不需要显示的时间,只要不设置尺寸就行了. 一个if判断的技巧,为 ...

  9. linux进程管理之进程创建

    所谓进程就是程序执行时的一个实例. 它是现代操作系统中一个很重要的抽象,我们从进程的生命周期:创建,执行,消亡来分析一下Linux上的进程管理实现. 一:前言 进程管理结构; 在内核中,每一个进程对应 ...

  10. AngularJS进阶(二十七)实现二维码信息的集成思路

    AngularJS实现二维码信息的集成思路        赠人玫瑰,手留余香.若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,与君共勉!      注:点击此处进行知识充电 ...