Redis模块化基本介绍
概要
- Redis Modules System基本概念
- 基本应用
- 参考资料
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模块化基本介绍的更多相关文章
- C语言模块化编译介绍
C语言模块化编译介绍 模块化编程的概念 所谓模块化变成(多文件开发),就是多文件(.c文件)编程,一个.c文件和一个.h文件可以被称为一个模块. 头文件开发的注意事项: 1)头文件中可以和C程序一样引 ...
- Redis常用数据类型介绍、使用场景及其操作命令
Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...
- Redis --> Redis的接口介绍及使用
Redis的接口介绍及使用 Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型.Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然 ...
- redis锁机制介绍与实例
转自:https://m.jb51.net/article/154421.htm 今天小编就为大家分享一篇关于redis锁机制介绍与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要 ...
- [原]Redis详细配置介绍
Redis详细配置介绍 # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 ...
- Redis主从复制简单介绍
由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基本一致! (精读阅读本篇可能花费您15分钟,略读需5分 ...
- 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...
- Redis学习01——介绍与搭建环境
Redis学习01介绍与搭建环境一简介二yum配置已经配置了的可以跳过三安装gcc四安装redis1 上传Redis到linux中2 解压到usrlocal下3 编译redis4 安装redis5 拷 ...
- Redis的简单介绍及在Windows下环境搭建
简单介绍 1,Redis是什么 最直接的还是看官方的定义吧. Redis is an open source (BSD licensed), in-memory data structure stor ...
随机推荐
- python的文件操作file:(内置函数,如seek、truncate函数)
file打开文件有两种方式,函数用file()或者open().打开后读入文件的内容用read()函数,其读入是从文件当前指针位置开始,所以需要控制指针位置用: 一.先介绍下file读入的控制函数: ...
- javascript之BOM浏览器对象模型引入
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 防止Android程序被系统kill掉的处理方法
转载请注明出处:http://blog.csdn.net/cuiran/article/details/38851401 目前遇到一个问题程序需要一直运行,并显示在最前端,但是运行一段时间发现会被系统 ...
- android官方技术文档翻译——工具属性
本文译自androd官方技术文档<Tools Attributes>:http://tools.android.com/tech-docs/tools-attributes 本文地址:ht ...
- Java应用服务器Resin
Resin是CAUCHO公司(http://www.caucho.com/)的产品,是一个非常流行的支持servlets 和jsp的引擎,速度非常快.Resin本身包含了一个支持HTTP/1.1的WE ...
- ISLR系列:(2)分类 Logistic Regression & LDA & QDA & KNN
Classification 此博文是 An Introduction to Statistical Learning with Applications in R 的系列读书笔记,作为本人的一 ...
- Protobuf-java maven配置
Protobuf-java maven配置 1. maven pom片断 <!-- protobuf-java for maven plugin http://stackoverflow.com ...
- (二十一)即时通信的聊天气泡的实现II
一些优化: 禁止TableView的点击: self.tableView.allowsSelection = NO; 合并相同的时间: 不需要显示的时间,只要不设置尺寸就行了. 一个if判断的技巧,为 ...
- linux进程管理之进程创建
所谓进程就是程序执行时的一个实例. 它是现代操作系统中一个很重要的抽象,我们从进程的生命周期:创建,执行,消亡来分析一下Linux上的进程管理实现. 一:前言 进程管理结构; 在内核中,每一个进程对应 ...
- AngularJS进阶(二十七)实现二维码信息的集成思路
AngularJS实现二维码信息的集成思路 赠人玫瑰,手留余香.若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,与君共勉! 注:点击此处进行知识充电 ...