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

bvjveswy  于 2022-10-31  发布在  Redis
关注(0)|答案(1)|浏览(162)

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

{
  id: "someUniqueId",
  foo: "otherData",
  bar: 30
}

我想在RedisJSON中存储数百个这样的对象。我正在使用node-redis client

await client.json.set('json-objects', `$`, {});

然后,我将对象添加到该键的根对象中,如下所示:

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

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

这将在他们键'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...
}

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

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

我的问题是:**这是存储数据的最佳方式吗?或者将每个对象存储在自己的RedisJSON键中会更高效,还是以其他方式?**我用这种方式的唯一问题是,当我不可避免地需要在RedisJSON中缓存其他数据类型时,我如何区分objectTypeAobjectTypeB?我可以在键前加上一个数据类型吗?如下所示:

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);

这似乎不是首选的方法。也许我现在做的JSON路径查找并不是那么低效?

ycl3bljg

ycl3bljg1#

将其分散到多个关键点上是这里要走的路。
将所有东西都放在一个大键中意味着这个大键位于一个分片上。当你只有一个节点时,这不是什么大问题。但是当你需要扩展时,你需要一个集群,这个键仍然位于一个分片上。集群中的其他分片将不会被使用。因此它不会扩展。
这就是我们所说的“热键”,可能是各种痛苦和麻烦的来源。
在键名中添加类型前缀是Redis的一种常见模式,也是一种非常合适的处理方式。我们称之为keyspace,所以,这是一个不错的想法。
通常,我们使用冒号来分隔键空间,所以,如果我在存储大脚怪目击事件、UFO目击事件和Redis,你可以使用如下键空间:

sightings:bigfoot:12345
sightings:ufo:67890

冒号只是一个惯例--你喜欢怎么用就怎么用。不要让我告诉你如何生活!😉

相关问题