You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌入式Linux C应用使用hiredis向Redis发送JSON格式数据的疑问

你给出的redisCommand()用法是错误的,无法实现需求,具体原因和可行方案如下:

错误原因

  • 你传入的命令字符串缺少合法的Redis操作指令和目标键名,Redis无法识别你要执行的操作、也不知道数据要写入哪个键,执行后一定会返回错误。

两种可行实现方案

可以根据业务需求选择合适的方案:

方案1:直接存储完整JSON字符串(适合需要整体读写JSON的场景)

你需要先通过轻量JSON序列化库(嵌入式场景推荐cJSON)把字段拼接成符合要求的完整JSON字符串,再调用Redis的SET命令写入:

// 用cJSON构造目标JSON结构
cJSON *root = cJSON_CreateObject();
cJSON_AddNumberToObject(root, "value", 1000.1);
cJSON_AddStringToObject(root, "unit", "mA");
cJSON_AddStringToObject(root, "name", "Current");
char *json_str = cJSON_PrintUnformatted(root);

// 写入Redis,示例键名为sensor:current,可自定义
redisReply *reply = redisCommand(redisContext, "SET sensor:current %s", json_str);

// 用完释放资源
freeReplyObject(reply);
cJSON_Delete(root);
free(json_str);

方案2:存储为Redis Hash结构(更适配嵌入式场景,节省资源)

如果后续需要单独读取/修改某个属性(比如仅更新value不需要改动其他字段),用Hash结构比存储整串JSON更省算力,不需要每次读写都做JSON序列化/反序列化,写法如下:

// 命令格式:HSET 键名 字段1 值1 字段2 值2 ...
redisReply *reply = redisCommand(redisContext, "HSET sensor:current value %f unit %s name %s", 1000.1, "mA", "Current");
freeReplyObject(reply);

这种方式读取单个属性可以直接调用HGET sensor:current value,读取所有属性调用HGETALL sensor:current即可。

注意:每次调用redisCommand后都需要判断返回的reply是否为NULL,以及reply->type是否符合预期,避免因连接中断、命令错误导致的段错误。

内容的提问来源于stack exchange,提问作者Engineer999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:54:07