如何在 RedisJSON 中存储大量对象?

bap*_*n93 0 javascript redis node.js node-redis redisjson

假设我有一个 JavaScript 对象,其结构如下:

{
  id: "someUniqueId",
  foo: "otherData",
  bar: 30
}
Run Code Online (Sandbox Code Playgroud)

我想在RedisJSON中存储数百个。我目前正在使用node-redis 客户端将密钥初始化'json-objects'为空对象:

await client.json.set('json-objects', `$`, {});
Run Code Online (Sandbox Code Playgroud)

然后,我将对象添加到该键的根对象,例如:

const dataToStore = {
  id: "someUniqueId",
  foo: "otherData",
  bar: 30
}

await client.json.set('json-objects', `$.${dataToStore.id}`, dataToStore as any);
Run Code Online (Sandbox Code Playgroud)

这会导致键下出现一个大对象,'json-objects'如下所示:

{
  "someUniqueId-1": {
    id: "someUniqueId-1",
    foo: "otherData",
    bar: 30
  },
  "someUniqueId-2": {
    id: "someUniqueId-2",
    foo: "otherData2",
    bar: 31
  },
  "someUniqueId-3": {
    id: "someUniqueId-3",
    foo: "otherData3",
    bar: 32
  },
  and so on...
}
Run Code Online (Sandbox Code Playgroud)

然后我可以使用路径查询和更新:

await client.json.set('json-objects', `$.${id}.foo`, "someUpdatedData");
Run Code Online (Sandbox Code Playgroud)

我的问题是:这是存储数据的最佳方式,还是将每个对象存储在它自己的 RedisJSON 键或其他方式中会更有效?这样做的唯一问题是,当我不可避免地需要在 RedisJSON 中缓存其他数据类型时,如何objectTypeA区分?objectTypeB我可以为键添加数据类型前缀吗?像下面这样:

const dataToStore = {
      id: "someUniqueId",
      foo: "otherData",
      bar: 30
    }

await client.json.set(dataToStore.id, `$`, dataToStore as any);
// -OR-
await client.json.set(`objectTypeA-${dataToStore.id}`, `$`, dataToStore as any);
Run Code Online (Sandbox Code Playgroud)

这感觉不是执行此操作的首选方法。也许我现在所做的实际上并不是 JSON 路径查找效率那么低?

Guy*_*yse 6

将其分布在多个键上是这里的方法。

\n

将所有内容都放在一个大密钥中意味着该大密钥位于单个分片上。当您只有一个节点时,这不是一个大问题。但是,当需要扩展并且需要集群时,该密钥仍将位于单个分片上。集群中的其他分片将不会被使用。因此它不会扩展。

\n

这就是我们所说的“热键”,可能是各种痛苦和麻烦的根源。

\n

在键名称中添加类型前缀的想法是 Redis 中的常见模式,并且是处理此问题的非常合适的方法。我们称它们为键空间。所以,想法很扎实。

\n

通常,我们使用冒号来分隔键空间。因此,如果我要存储 Bigfoot 目击事件和 UFO 目击事件以及 Redis,您可能会使用如下键空间:

\n
sightings:bigfoot:12345\nsightings:ufo:67890\n
Run Code Online (Sandbox Code Playgroud)\n

冒号只是一个约定\xe2\x80\x94,使用你喜欢的任何东西。不要让我告诉你如何生活!

\n

  • 谢谢,我意识到转向这种方法还将使我能够更好地利用特定对象的键空间通知,以及允许使用模式匹配对整个或部分前缀进行键空间通知的前缀。 (2认同)