Hiredis 构建 Redis 命令实战指南

一、同步命令构造

1.1 redisCommand(fmt, …)

最常用的同步接口即 redisCommand,其原型如下:

void *redisCommand(redisContext *c, const char *format, ...);
  • 参数

    • c:已连接的 redisContext*
    • format:与 printf 类似的格式字符串
// 基本用法:发送 SET foo bar
redisReply *reply = redisCommand(c, "SET foo bar");// 插值字符串:发送 SET key:1 Hello
char *myKeyNumber = "1", *myValue = "Hello";
redisReply *r2 = redisCommand(c, "SET key:%s %s", myKeyNumber, myValue);
支持二进制数据:%b

当需要存储或检索二进制数据(如向量嵌入)时,可使用 %b,并在后面传入指针与长度:

char *entryNumber = "1";
char *embedding = "<binary data>";
size_t embLen = 13;
char *url = "https://redis.io/";redisReply *r3 = redisCommand(c,"HSET entry:%s embedding %b url %s",entryNumber,embedding, embLen,url
);

注意:除了 %% 外,不支持其它 printf 规格(例如 %d)。

1.2 redisCommandArgv(argv, argvlen)

当参数来自数组或包含多段二进制时,直接使用 redisCommandArgv 更安全:

void *redisCommandArgv(redisContext *c,int argc,const char **argv,const size_t *argvlen
);
  • 示例:发送 SET greeting hello
const char *argv[]     = {"SET", "greeting", "hello"};
const size_t argvlen[] = {3,       8,          5};
int argc = 3;redisReply *reply = redisCommandArgv(c, argc, argv, argvlen);

若传入 argvlen=NULL,Hiredis 会调用 strlen(),但遇二进制数据仍应显式提供长度数组。

二、异步命令构造

对于高并发场景,非阻塞地发送命令并处理回调极为关键。Hiredis 提供与同步接口对应的异步版本。

2.1 基础接口

int redisAsyncCommand(redisAsyncContext *ac,redisCallbackFn *fn,void *privdata,const char *format,...
);int redisAsyncCommandArgv(redisAsyncContext *ac,redisCallbackFn *fn,void *privdata,int argc,const char **argv,const size_t *argvlen
);
  • 参数

    • ac:异步上下文 redisAsyncContext*
    • fn:可选的回调函数,命令执行完毕后触发
    • privdata:用户自定义数据,回调时原样传回
    • format / argv:与同步接口一致

2.2 回调函数签名

void getCallback(redisAsyncContext *c, void *reply, void *privdata) {redisReply *r = reply;char *key = privdata;if (!r) {if (c->errstr) printf("errstr: %s\n", c->errstr);return;}printf("Key: %s, value: %s\n", key, r->str);// 使用完毕后优雅断开redisAsyncDisconnect(c);
}

2.3 示例:混合使用

// 1. 异步 SET,不关心结果
char *key = "testkey", *value = "testvalue";
redisAsyncCommand(ac, NULL, NULL, "SET %s %s", key, value);// 2. 异步 GET,需回调处理
redisAsyncCommand(ac, getCallback, key, "GET %s", key);

异步上下文在事件循环中调度,执行完所有回调后,可在回调内调用 redisAsyncDisconnect(ac) 进行优雅断开;若需立即释放,使用 redisAsyncFree(ac)

三、处理命令回复

所有命令回复均通过 redisReply 结构体返回,其 type 字段指示具体格式(字符串、整数、数组等),详见 Hiredis 文档的“Handle replies”章节。务必检查 reply->typereply->str / reply->integer 等字段,以确保正确解析。

四、最佳实践与性能优化

  1. 二进制安全:凡涉及原始字节,统一使用带长度参数的 %bargvlen,避免 strlen() 截断。
  2. 复用 Context:长连接或连接池可显著减少频繁连接带来的开销。
  3. 批量命令:结合 MULTI/EXEC 或 Lua 脚本,减少网络往返次数。
  4. 异步模式:高并发场景优先考虑异步接口,并合理使用回调释放资源。
  5. 错误处理:检查 c->errac->errstrreply->type == REDIS_REPLY_ERROR,以便日志告警和重试。

五、总结

Hiredis 虽然接口简洁,但通过 redisCommand/redisCommandArgvredisAsyncCommand/redisAsyncCommandArgv,可完全满足同步与异步场景下对 Redis 的灵活访问需求。结合合适的错误检查、连接复用及批量操作设计,您的 C/C++ 应用即可实现高性能、低延迟的 Redis 通信能力。希望本文能帮助您快速上手 Hiredis,并在生产环境中游刃有余地构造各类 Redis 命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92472.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库】国产数据库的新机遇:电科金仓以融合技术同步全球竞争

7月15日&#xff0c;国产数据库厂商中电科金仓&#xff08;北京&#xff09;科技股份有限公司&#xff08;以下简称“电科金仓”&#xff09;在北京举行了一场技术发布会&#xff0c;集中发布四款核心产品&#xff1a;AI时代的融合数据库KES V9 2025、企业级统一管控平台KEMCC、…

大模型 Function Call 的实现步骤及示例详解

大模型 Function Call 的实现步骤及示例详解一、Function Call的核心流程拆解二、结合代码详解Function Call实现步骤1&#xff1a;定义工具&#xff08;对应代码中的tools列表&#xff09;步骤2&#xff1a;实现工具函数&#xff08;对应代码中的get_current_weather和get_cur…

Linux运维新手的修炼手扎之第24天

mysql服务1 mysql命令客户端(mysql.cnf)命令 \c--ctrl c \s--显示当前状态 \r--客户端重新连接 \h--查看帮助信息 exit退出客户端 \G--垂直格式显示查询结果连接MySQL服务器--[rootrocky9 ~]# mysql(mysql -u用户名 - p密码 -h服务端ip -P服务端port -S服务端sock -e "my…

面向对象分析与设计40讲(7)设计原则之合成复用原则

文章目录 一、概念 二、示例(C++ 实现) 1. 违反合成复用原则的示例(过度使用继承) 2. 遵循合成复用原则的示例(使用组合) 三、总结 1. 继承是“强绑定”,组合是“弱关联” 2. 继承固化“静态结构”,组合支持“动态变化” 3. 继承放大“设计缺陷”,组合隔离“局部问题”…

Git 完全手册:从入门到团队协作实战(4)

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《C修炼之路》、《Linux修炼&#xff1a;终端之内 洞悉真理…

解决Spring事务中RPC调用无法回滚的问题

文章目录问题分析解决方案实现原理解析执行流程说明运行实例正常流程执行执行异常流程关键优势在分布式系统开发中&#xff0c;我们经常会遇到本地事务与远程服务调用结合的场景。当本地事务包含RPC调用时&#xff0c;如果事务回滚&#xff0c;RPC调用已经执行就会导致数据不一…

sqli-labs通关笔记-第13关 POST报错型注入(单引号括号闭合 手工注入+脚本注入两种方法)

目录 一、字符型注入 二、limit函数 三、GET方法与POST方法 四、源码分析 1、代码审计 2、SQL注入安全分析 3、报错型注入与联合注入 五、渗透实战 1、进入靶场 2、注入点分析 &#xff08;1&#xff09;SQL语句 &#xff08;2&#xff09;admin) #注入探测 &…

康复器材动静态性能测试台:精准检测,为康复器械安全保驾护航

在康复医疗领域&#xff0c;无论是轮椅、拐杖、假肢还是康复床&#xff0c;每一件器械的强度与稳定性都直接关系到使用者的安全与康复效果。如何确保这些器械在实际使用中经得起反复考验&#xff1f;Delta德尔塔仪器推出的康复器材动静态性能测试台&#xff0c;凭借其高精度、智…

vue3中el-table表头筛选

效果如下&#xff0c;可以勾选表头进行隐藏&#xff0c;也可以对表头进行拖动排序index主界面 <script> let tempHead []; const showFilter ref<boolean>(false); let tableHeadList ref<TableHeadItem[]>([{ prop: "displayId", label: "…

数据结构 之 【排序】(直接选择排序、堆排序、冒泡排序)

目录 1.直接选择排序 1.1直接选择排序的思想 1.2直接选择排序的代码逻辑 1.3完整排序代码 1.3.1一次只选一个最值 1.3.2一次筛选出两个最值 1.4直接选择排序的时间复杂度与空间复杂度 2.堆排序 2.1堆排序的思想 2.2堆排序的具体步骤 2.3堆排序图解 2.4完整排序代码…

用手机当外挂-图文并茂做报告纪要

前阵参加一个峰会,看到演讲嘉宾每翻一页PPT,下面的观察就举起手机一顿拍。实话说这种拍下来的,难说还会拿出来看,而且再看的时候也未必能对应到当时主讲人的一些解释 。 如果现场将图片保存到笔记本电脑,并快速记录关键信息,这样听完一个报告可能就直接输出一篇报道了。 有…

Vue的ubus emit/on使用

这段代码是 Vue.js 组件中的 mounted 生命周期钩子函数&#xff0c;主要作用是监听一个名为 “macSelectData” 的全局事件。具体行为如下&#xff1a;分步解释&#xff1a;mounted() 生命周期钩子 当组件被挂载到 DOM 后&#xff0c;Vue 会自动调用 mounted() 方法。这里常用于…

rsync报错解决

问题说明 [rootlocalhost shyn]# rsync -avz --checksum "root192.168.159.133:/tmp/shyn" "/tmp /shyn"WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! …

ArKTS: DAL,Model,BLL,Interface,Factory using SQLite

HarmonyOS 用ohos.data.rdb 用DBHelper.ets 共用调用SQLite 库&#xff0c;进行DAL,Model,BLL,Interface,Factory 框架模式&#xff0c;表为CREATE TABLE IF NOT EXISTS signInRecord ( id INTEGER PRIMARY KEY AUTOINCREMENT, employeeId TEXT NOT NULL, employeeName TEXT NO…

MySQL JSON 数据类型用法及与传统JSON字符串的对比 JSON数据类型简介

文章目录前言1. 基本用法JSON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引支持JSON存储对象和数组的性能考虑1. 存储对象2. 存储数组性能对比总结最佳实践建议前言 MySQL从 5.7 版本开始引入了 JSON 数据类型&#xff0c;专门用于存储 JSON 格式的数据。与传…

C++:list(1)list的使用

list的使用一.list基本的结构1.环状双向链表2.哨兵节点3.迭代器4.节点结构5.链表遍历6.迭代器失效二.list的基本使用1.test01函数&#xff1a;主要测试std::list的初始化方式及遍历2.test02函数&#xff1a;主要测试std::list的常用成员函数操作3.测试结果如下三.list的其他操作…

ArcGIS地形起伏度计算

地形起伏度计算地形起伏度步骤1&#xff1a;计算最大值。步骤2&#xff1a;计算最小值。步骤3&#xff1a;计算地形起伏度。地形起伏度、地形粗糙度、地表切割深度和高程变异系数均为坡面复杂度因子&#xff0c;是一种宏观的地形信息因子&#xff0c;反映的是较大的区域内地表坡…

llama factory新手初步运行完整版

1、新建conda环境名称为llama_factory&#xff0c;并激活 conda create -n llama_factory python3.10 conda activate llama_factory2、激活后可检查内部包是否纯净&#xff0c;要确保环境内包较纯净&#xff0c;不然后续安装对应包会出现一系列水土不服的问题&#xff0c;导致…

Tomcat与JDK版本对照全解析:避坑指南与生产环境选型最佳实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

短视频矩阵的未来前景:机遇无限,挑战并存

在当今数字化信息飞速传播的时代&#xff0c;短视频以其独特的魅力迅速席卷全球&#xff0c;成为人们获取信息、娱乐消遣的重要方式之一。短视频矩阵作为一种高效的内容传播与运营模式&#xff0c;正逐渐展现出其强大的影响力和潜力。本文将深入探讨短视频矩阵的未来前景&#…