我正在创建一个脚本,我希望使用流将一些虚拟数据发送到 Redis 服务器。 为此,我将“ioredis”模块用于 Redis 流。 当我发送简单的键值结构时,它工作正常,即
{a:"hello",b:"world"}
。
但是不适用于Json数组结构。
{
"name": "abc",
"ts": 123,
"lists": [{
"oil": "1",
"food": "1,
"item": "1"
}]
}
它会抛出类似的错误
throw new Error(`Data type of property ${key} is not supported.`);
do允许键值数据与每个事件关联。请注意,键和值都必须是字符串。
ioredis 使用键和值的可变参数来实现这一点。 ioredis 存储库上有一个示例,但以下是您可能关心的部分:
client.xadd("user-stream", "*", "name", "John", "age", "20")
Node Redis 有不同的语法,允许您传入 JavaScript 对象。但是,那个物体必须是扁平的并且充满了绳子。 GitHub 上有一个 示例 但这里是 tl;dr:
client.xAdd('user-stream', '*', { name: "John", age: "20" })
另请注意,在两种情况下,函数都是 async
,因此如果您愿意,可以
await
。如果您想将 JSON 存储在 Redis 的 Stream 中的事件中,您需要首先对其进行字符串化:
const data = JSON.stringify({
"name": "abc",
"ts": 123,
"lists": [{
"oil": "1",
"food": "1",
"item": "1"
}]
})
/* if you use ioredis */
client.xadd("user-stream", "*", "data", data)
/* if you use Node Redis */
client.xAdd('user-stream', '*', { data })
希望这有帮助!
数据类型。
还有一些替代方案。
RedisJSON。在 Redis 中提供 JSON 支持的模块。
Node Redis对此有一个巧妙的解决方案这里。您可以考虑在 ioredis 中使用相同的内容,如下所示:
const args = [];
for (const [key, value] of Object.entries(reportingRequest)) {
args.push(key, value);
}
client.xadd(REDIS_STREAM_KEY, '*', ...args);