如何在Redis流NodeJs中发送JSON

问题描述 投票:0回答:3

我正在创建一个脚本,我希望使用流将一些虚拟数据发送到 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.`);
    
javascript node.js redis redis-streams
3个回答
4
投票
Redis Streams 不处理 JSON。它们

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 })
希望这有帮助!


2
投票
JSON 不是开箱即用的 Redis 的有效

数据类型

还有一些替代方案。

  • 您可以将 JSON 结构序列化为字符串并将该字符串存储到 Redis 中。当您稍后从 Redis 恢复它时,您需要将其反序列化为 JSON 结构。

  • 在 Redis 安装中包含

    RedisJSON。在 Redis 中提供 JSON 支持的模块。


0
投票

Node Redis对此有一个巧妙的解决方案这里。您可以考虑在 ioredis 中使用相同的内容,如下所示:

const args = []; for (const [key, value] of Object.entries(reportingRequest)) { args.push(key, value); } client.xadd(REDIS_STREAM_KEY, '*', ...args);
    
© www.soinside.com 2019 - 2024. All rights reserved.