【问题标题】:set json value from file to redis将文件中的 json 值设置为 redis
【发布时间】:2017-11-18 16:30:54
【问题描述】:

我有一个 bash.sh 脚本:

#!/usr/bin/env bash

val=$(cat ../my-microservice/conf/config.json)

echo "set my-microservice-config ${val}" |  redis-cli

config.json 的位置:

{
  "key" : "value"
}

当我运行它时,我得到了:

ERR 未知命令'}'

如何从 json 文件中正确设置 json 值?

【问题讨论】:

  • 您需要将 JSON 存储为字符串、HASH、原生 JSON 还是其他?

标签: json bash redis redis-cli


【解决方案1】:

如果您尝试将 my-microservice-config 键的 string 值设置为 JSON 文件的内容(或任何其他内容,包括二进制文件),最简单的方法是使用 -x option in redis-cli 到 逐字读取命令的最后一个参数,来自stdin。例如:

$ redis-cli -x set my-microservice-config < config.json
OK

对于您的示例,这将存储:

$ redis-cli get my-microservice-config
"{\n      \"key\" : \"value\"\n}\n"

要存储 JSON 数据的紧凑表示,您可以使用 jq . with -c 标志:

$ jq -c . config.json | redis-cli -x set my-microservice-config
OK
$ redis-cli get my-microservice-config
"{\"key\":\"value\"}\n"

请注意,Redis 本身并不支持 JSON,但如果您需要 interpreted JSON values(JSON 数据类型),可以使用 ReJSON module

【讨论】:

【解决方案2】:

您需要在值上使用引号,因为它包含空格 - 将脚本的最后一行更改为:

echo "set my-microservice-config \"${val}\"" |  redis-cli

【讨论】:

  • 这在val 包含\n 时不起作用(试试OP 的例子)。一种选择是使用jq -c 重新格式化JSON 文件,但redis-cli-x 选项可以处理任何二进制 数据(包括NULs,shell 变量永远无法处理)。
  • @randomir 好点,我更喜欢你的-x 答案(顺便说一句,我是第一个赞成票)。但是,OP 脚本的核心问题是缺少引号,所以我觉得有必要指出它:)
  • 实际上,我在答案的初稿中建议了引号(您可以检查编辑),但后来意识到它们对于处理自定义 JSON 不够可靠。 :) 顺便说一句,rejson 模块做得很好! :)
猜你喜欢
  • 2014-10-11
  • 2012-10-12
  • 2018-02-20
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 2018-12-08
相关资源
最近更新 更多