嵌入式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
相关产品推荐
相关产品推荐

