Redis(138) Redis的模块如何开发?

作者:Victor356日期:2025/11/22

Redis 模块开发是一种扩展 Redis 功能的强大方式。通过模块,开发者可以向 Redis 添加新的命令、数据类型、事件处理器等。以下是开发 Redis 模块的详细步骤,包括必要的代码示例。

1. 包含必要的头文件

首先,需要包含 Redis 模块 API 的头文件 redismodule.h。该头文件定义了开发模块所需的所有函数和宏。

1#include "redismodule.h"
2

2. 实现模块命令

每个模块命令对应一个处理函数。这些函数需要遵循特定的签名,即返回 int 类型,并接受 RedisModuleCtx *ctx, RedisModuleString **argv, int argc 作为参数。

下面是一个简单的命令处理函数示例,该命令返回 "Hello, World!" 字符串。

1int HelloWorldCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
2    if (argc != 1) {
3        return RedisModule_WrongArity(ctx);
4    }
5    RedisModule_ReplyWithSimpleString(ctx, "Hello, World!");
6    return REDISMODULE_OK;
7}
8

3. 模块初始化函数

模块初始化函数用于注册模块和命令。通过调用 RedisModule_Init 函数初始化模块,并使用 RedisModule_CreateCommand 函数注册命令。

1int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
2    if (RedisModule_Init(ctx, "hello", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) {
3        return REDISMODULE_ERR;
4    }
5    if (RedisModule_CreateCommand(ctx, "hello.world", HelloWorldCommand, "readonly", 0, 0, 0) == REDISMODULE_ERR) {
6        return REDISMODULE_ERR;
7    }
8    return REDISMODULE_OK;
9}
10

4. 编译模块

将上述代码保存为 hello.c 文件,并通过以下命令编译为动态库:

1gcc -fPIC -shared -o hello.so hello.c -I/path/to/redis/src
2

注意:-fPIC 选项用于生成位置无关代码,-shared 选项用于生成共享库,-I 选项指定 Redis 源代码的路径。

5. 加载和使用模块

通过 Redis 客户端加载模块:

1redis-cli MODULE LOAD ./hello.so
2

加载成功后,可以使用新命令 hello.world

1redis> hello.world
2"Hello, World!"
3

复杂模块示例:计数器模块

接下来,我们实现一个简单的计数器模块,该模块支持两个命令 counter.incrcounter.get,分别用于增加计数器和获取当前计数。

1. 包含头文件

1#include "redismodule.h"
2

2. 定义全局变量

定义一个全局变量表示计数器的值。

1static long long counter = 0;
2

3. 实现命令处理函数

实现 counter.incrcounter.get 命令的处理函数。

1int CounterIncrCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
2    if (argc != 1) {
3        return RedisModule_WrongArity(ctx);
4    }
5    counter++;
6    RedisModule_ReplyWithLongLong(ctx, counter);
7    return REDISMODULE_OK;
8}
9
10int CounterGetCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
11    if (argc != 1) {
12        return RedisModule_WrongArity(ctx);
13    }
14    RedisModule_ReplyWithLongLong(ctx, counter);
15    return REDISMODULE_OK;
16}
17

4. 模块初始化函数

在模块初始化函数中注册 counter.incrcounter.get 命令。

1int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
2    if (RedisModule_Init(ctx, "counter", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) {
3        return REDISMODULE_ERR;
4    }
5    if (RedisModule_CreateCommand(ctx, "counter.incr", CounterIncrCommand, "write", 0, 0, 0) == REDISMODULE_ERR) {
6        return REDISMODULE_ERR;
7    }
8    if (RedisModule_CreateCommand(ctx, "counter.get", CounterGetCommand, "readonly", 0, 0, 0) == REDISMODULE_ERR) {
9        return REDISMODULE_ERR;
10    }
11    return REDISMODULE_OK;
12}
13

5. 编译和加载模块

将代码保存为 counter.c 文件,并通过以下命令编译为动态库:

1gcc -fPIC -shared -o counter.so counter.c -I/path/to/redis/src
2

然后,通过 Redis 客户端加载模块:

1redis-cli MODULE LOAD ./counter.so
2

加载成功后,可以使用新命令 counter.incrcounter.get

1redis> counter.incr
2(integer) 1
3redis> counter.incr
4(integer) 2
5redis> counter.get
6(integer) 2
7

总结

Redis 模块开发允许开发者通过编写 C 代码动态扩展 Redis 的功能。开发步骤包括包含模块 API 头文件、定义模块上下文、实现命令处理函数、注册命令以及编译和加载模块。通过上述简单示例和复杂示例,展示了如何实现自定义命令,并在 Redis 中加载和使用这些命令。通过这些步骤,开发者可以根据需要扩展 Redis 的功能,为特定应用场景提供更强大的支持。


Redis(138) Redis的模块如何开发?》 是转载文章,点击查看原文


相关推荐


C++对象模型_第五章_C++函数语义学
Mr_WangAndy2025/11/20

本文介绍C++对象模型之函数语义学,揭露C++成员函数的神秘面纱,探究C++多态的底层原理,虚继承,类型转换原理。 文章目录 第5章 函数语义学5.1 普通成员函数调用方式5.2虚成员函数、静态成员函数调用方式5.2.1 虚成员函数调用方式5.2.2 静态成员函数调用方式 5.3虚函数地址转换---vcall引入5.4 静动态类型、绑定,多态实现5.4.1 静态类型和动态类型5.4.2 静态绑定和动态绑定5.4.3 继承的非虚函数坑5.4.4 虚函数的动态绑定5.4.5 重


Android多SDK合并为单个JAR包的完整指南
安卓蓝牙Vincent2025/11/19

痛点 多 SDK 分散:每个功能模块单独提供 JAR,用户需要逐一集成和管理 调用复杂:不同模块间存在依赖和包名冲突,用户在项目中使用不方便 升级维护困难:每次更新都要同步多个 JAR,容易出错 一、核心原理 1.1 最推荐的方案:源码合并 + 下层库作为“源码目录”加入 多 SDK 合并时,最终有效的构建环境只有顶层 SDK,因此最稳定的方式是: 源码合并(sourceSets) + 移除模块依赖 + 将下层 SDK 作为源码目录引入(而不是 module) Android St


Python 的内置函数 super
IMPYLH2025/11/17

Python 内建函数列表 > Python 的内置函数 super Python 的内置函数 super() 是一个非常重要的内置函数,主要用于在子类中调用父类(超类)的方法。这个函数在面向对象编程中扮演着关键角色,特别是在处理继承关系时。 基本用法 super() 最常见的用法是在子类的初始化方法中调用父类的初始化方法: class Parent: def __init__(self, name): self.name = name class Child(


Python 的内置函数 pow
IMPYLH2025/11/16

Python 内建函数列表 > Python 的内置函数 pow Python 的内置函数 pow() 是一个用于计算幂运算的强大工具。它有两种基本用法,可以计算数值的幂次方,也支持进行模运算。 基本语法 pow(base, exp) 参数说明 base:底数,可以是整数或浮点数exp:指数,可以是整数或浮点数 使用示例 基本幂运算: pow(2, 3) # 返回8 (2的3次方) pow(2.5, 2) # 返回6.25 (2.5的平方) 带模运算: pow(2,


🔥 “Solo Coding”的近期热度解析(截至 2025 年末)
LeonGao2025/11/15

🧠 一、概念回顾 Solo Coding 并不是新词,但在过去一年随着 AIGC 编程辅助工具(如 Copilot、Cursor、TabNine、ChatGPT Code Interpreter) 的普及,它被重新定义为: 一个人独立开发完整系统,但具备团队级效率。 这与传统意义的“独立开发者(Indie Developer)”不同,核心在于借助 AI 的合作力量,实现准团队式的个人生产力爆发。 📈 二、热度增长趋势 时间区间关键词趋势


Python 的内置函数 iter
IMPYLH2025/11/14

Python 内建函数列表 > Python 的内置函数 iter Python 的内置函数 iter() 用于创建一个迭代器对象,它可以将可迭代对象(如列表、元组、字典、集合等)转换为迭代器,从而支持逐个访问元素的操作。 基本语法 iter(iterable, sentinel) iterable:必需参数,表示要转换为迭代器的可迭代对象(如列表、字符串等)。sentinel:可选参数,用于指定迭代停止的条件值(主要用于自定义迭代行为)。 示例说明 基本用法(无 sentinel


python+uniapp基于微信小程序的垃圾分类信息系统
Q_Q5110082852025/11/13

目录 项目介绍本项目具体实现截图开发技术大数据类设计开发的基本流程是:论文大纲结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 项目介绍 本文介绍了一款基于微信小程序的垃圾分类信息系统。该系统旨在帮助用户更便捷地了解垃圾分类知识,提高垃圾分类的准确性和效率。通过微信小程序平台,用户可以随时随地查询各类垃圾的归属类别,并获取详细的分类指导。 本研究首先进行了用户需求分析,明确了平台应具备的功能和特点。然后,利用微信小程序开发技术,设计并实现了该平台。课题主要分为


HTML 的 <svg> 标签
hubenchang05152025/11/11

#HTML 的 <svg> 标签 请查看 HTML 元素帮助手册 了解更多 HTML 元素。 如果 svg 不是根元素,svg 元素可以用于在当前文档(比如说,一个 HTML 文档)内嵌套一个独立的 svg 片段。这个独立片段拥有独立的视口和坐标系统。 #属性 请查看 HTML 元素的全局属性 了解 HTML 元素的全局属性。 #示例 <svg width="300" height="300" viewBox="0 0 300 300" xmlns="http://www.w3.org/


LRU 缓存的设计与实现
前似锦2025/11/9

目录 一、LRU 缓存的核心诉求 二、数据结构选型与设计思路 1. 双向链表:维护访问顺序的 “时间轴” 2. 哈希表:实现 key 的 O (1) 寻址 3. 组合设计:“哈希表 + 双向链表” 的协同工作 三、代码实现 1. 类结构定义 2. get 方法实现:查询并更新访问顺序 3. put 方法实现:插入、更新与容量控制 四、复杂度与边界场景分析 1. 时间复杂度 2. 边界场景处理 五、测试验证与工程价值 六、总结 在高并发与大数据场景中,缓存是提


Less-8 GET-Blind-Boolean Based-Single Quotes
泷羽Sec-静安2025/11/7

GET-盲注-基于布尔值-单引号 Less-8 代码分析 关键特征对比 特征Less-5Less-8SQL结构id='$id'id='$id'成功时“You are in”“You are in”失败时显示错误 mysql_error()什么都不显示注入类型报错注入/布尔盲注纯布尔盲注核心区别(关键!) // Less-5 else { echo 'You have an error in your SQL syntax'; print_r(mysql_error()); /

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读