Redis(137)Redis的模块机制是什么?

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

Redis 模块机制允许开发者扩展 Redis 的功能,通过编写动态加载的模块,可以向 Redis 添加新的命令、数据类型、事件处理器等。Redis 模块机制提供了一套 C 语言 API,开发者可以基于这些 API 实现自己的模块。

核心概念和数据结构

1. Redis 模块 API

Redis 提供了一套模块 API,主要通过 redismodule.h 头文件定义。开发者需要包含该头文件并使用其中的函数和宏来实现模块。

2. 模块结构

每个模块需要定义一个 RedisModuleCtx 结构体,表示模块上下文,以及若干模块命令。

3. 模块命令

模块可以通过 RedisModule_CreateCommand 函数注册新的命令,每个命令对应一个处理函数。

模块开发步骤

  1. 包含头文件:包含 redismodule.h 头文件。
  2. 定义模块上下文:定义并初始化模块上下文。
  3. 实现命令处理函数:实现命令处理函数。
  4. 注册命令:在模块初始化函数中注册命令。
  5. 编译和加载模块:编译模块为动态库,并通过 MODULE LOAD 命令加载模块。

示例模块代码

以下是一个简单的 Redis 模块示例,展示了如何实现一个新的命令 hello.world,该命令返回 "Hello, World!" 字符串。

1. 包含头文件

1#include "redismodule.h"
2

2. 实现命令处理函数

命令处理函数使用 RedisModuleString 类型表示参数,并通过 RedisModule_ReplyWithSimpleString 函数返回结果。

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

然后,通过 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 模块机制使得开发者可以通过编写扩展模块来增强 Redis 的功能。通过模块,开发者可以实现自定义命令、数据结构以及事件处理器。模块开发的基本步骤包括包含模块 API 头文件、定义模块上下文、实现命令处理函数、注册命令以及编译和加载模块。上述示例展示了如何实现简单的模块命令,以及更复杂的功能如计数器模块。通过这些示例,开发者可以理解 Redis 模块机制的基本原理和实现方法,并根据需要扩展 Redis 的功能。


Redis(137)Redis的模块机制是什么?》 是转载文章,点击查看原文


相关推荐


C语言-----扫雷游戏
Ravi_12025/11/19

扫雷游戏的功能说明 : • 使⽤控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格⼦ • 默认随机布置10个雷 • 可以排查雷: ◦ 如果位置不是雷,就显⽰周围有⼏个雷 ◦ 如果位置是雷,就炸死游戏结束 ◦ 把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束 test.c //⽂件中写游戏的测试逻辑 game.c //⽂件中写游戏中函数的实现等 game.h //⽂件中写游戏需要的数据类型和函数声明等 逻辑开始: 一、菜单 输入1进入游戏,输入


R语言在线编译器 | 提供快速便捷的编程环境,助力数据分析与学习
hyiciw_6422025/11/18

三十岁学编程:是挑战还是机会?|掌握编程技术,开启全新职业之路三十岁学编程,很多人可能会觉得自己已经不再适合入门这项技能。尤其在传统观念中,编程被视为年轻人的专属领域。然而,随着科技的不断发展,编程技能已经成为一种基础能力,甚至有着广阔的职业前景。对于三十岁的人来说,学习编程不仅是个人成长的一部分,更是迈向新职业的第一步。首先,三十岁的人在学习编程时,能够依靠自己丰富的生活经验与工作经历,这些都可以帮助他们更快地理解技术背后的应用场景。例如,对于在管理或市场领域工作的人来说,编程可以让他们更好地


C#.NET 全局异常到底怎么做?最完整的实战指南
唐青枫2025/11/17

简介 全局异常拦截是构建健壮企业级应用的关键基础设施,它能统一处理系统中未捕获的异常,提供友好的错误响应,同时记录完整的异常信息。 背景和作用 在 ASP.NET Core 应用中,异常可能在控制器、数据库操作或中间件中发生。如果每个动作方法都手动处理异常(如 try-catch),代码会变得冗长且难以维护。全局异常拦截器解决了以下问题: 统一错误处理:集中捕获所有未处理异常,返回标准化的错误响应。 标准化响应:符合 RESTful API 规范(如 RFC 7807 Problem D


c文件编译
芝麻馅汤圆儿2025/11/16

随笔记录 目录 1.背景 2. 编译 2.1 创建 .c 文件 2.2 编译->执行 1.背景 c文件在编译为可执行程序 2. 编译 2.1 创建 .c 文件 已知c 文件源码,创建 .c 文件并编译为可执行程序 1. creat *.c 文件 [root@localhost magx]# vim udp_nobind_sendto.c [root@localhost magx]# [root@localhost magx]# cat udp_nobind_


一句话把 Excalidraw 跑起来?SOLO Coder 把我以前踩过的坑都帮我填了
不惑_2025/11/14

Excalidraw 是一个开源、类手绘风格的虚拟白板工具,支持无限画布、暗色模式、图形库、导出 PNG/SVG、自由绘制、多语言、快捷键与绑定箭头等丰富能力。其官方应用原生支持 PWA 离线、本地优先存储、纯前端架构,非常适合私有化部署或内网使用。 要是你之前动手部署过开源项目,你应该懂那种感觉:教程看着简单,结果一动手就开始打怪,git clone → 解压 → 安装依赖 → 处理网络代理 → 启动服务 → 校验端口 → 本地预览。而这些步骤每一步都可能踩到网络、依赖、端口占用等坑。我以前搭


李飞飞「世界模型」正式开放,人人可用! Pro 版首月仅 7 元
新智元2025/11/13

「【新智元导读】只用一张图,一句话,就能创造出随便乱逛的 3D 世界——李飞飞这次不是在讲故事,而是真的给你「造梦神器」。今天起,全球上线,人人可用。」 李飞飞的「创世神器」今天终于正式上线了!人人可用。 这个由 WorldLabs 推出,名为 Marble 的网站,用世界模型可以生成瑰丽梦幻的「想象世界」~ 体验网址:marble.worldlabs.ai/ 这波属实是李飞飞自己联动自己了,前两天她的一篇万字长文火爆硅谷,定义 AI 的下一个十年是「空间智能」。 文章中,她为真正具备空间智


进入职场第四课—产出
Mapbarfront2025/11/12

新入职一家公司观察、融入、立足之后,要做的第四件事就是产出。 观察和融入帮你顺利度过新手期,立足则让你在团队中站稳脚跟,被大家真正接受,接下来你要做的是保持稳定,持续不断的产出,让团队感受到你究竟有多大能量。 易经乾卦中的终日乾乾,说的就是这个意思,终日指的是持续不断,意味着不能三天打鱼两天晒网,有了开头没有结尾,乾乾代表着产出,要有价值、有思考、有进阶,不能只做重复工作,毕竟在易经中,乾代表天,想完成立足到产出的关键跃升,以下这4个动作一定要做好。 1、产出有价值的成果。 立足期是你独立承担任


SpringBoot实现隐式参数注入
风象南2025/11/10

前言:一个痛点 想象一下这样的场景:用户请求带着 JWT Token 进入你的系统,Filter 层面解析 Token 得到用户 ID,接下来需要: 在 Controller 层获取用户信息 在 Service 层进行权限验证 在某些业务逻辑中记录操作日志 每一个环节都需要知道"当前用户是谁",看看目前常用的解决方案。 传统方案的"缺陷" 方案一:ThreadLocal // 看起来很"Hack" private static final ThreadLocal<Long> currentU


Python实战:用高德地图API批量获取地址所属街道并写回Excel
程序员爱钓鱼2025/11/8

在日常的数据处理工作中,我们经常需要根据公司、事件或门店的注册地址,批量获取其所在的街道信息,例如“浦东新区张江镇”“徐汇区龙华街道”等。 手动查询显然低效,而借助 Python + 高德地图API,我们可以轻松实现自动化批量查询并将结果写入 Excel 文件中。 本文将完整展示一个从 Excel 读取地址 → 调用高德API → 获取街道 → 写回Excel的实用脚本,并讲解实现细节与优化思路。 一、功能概述 这段脚本的功能可以总结为四步: 从 Excel 文件中读取地址数据; 调用高德


HTML中JS监听输入框值的即时变化
雨过天晴而后无语2025/11/5

一、说明         上一篇文章中提到了需要监听页面的一些组件内容变化,以便于更好的判断页面是否有更改,而控制“确定”按钮。         本里以JS监听输入框值的即时变化为引子,对这样的需求进行一个示例。 二、示例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmln

首页编辑器站点地图

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

Copyright © 2025 聚合阅读