假设我有一个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中缓存其他数据类型时,我如何区分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);
这似乎不是首选的方法。也许我现在做的JSON路径查找并不是那么低效?
1条答案
按热度按时间ycl3bljg1#
将其分散到多个关键点上是这里要走的路。
将所有东西都放在一个大键中意味着这个大键位于一个分片上。当你只有一个节点时,这不是什么大问题。但是当你需要扩展时,你需要一个集群,这个键仍然位于一个分片上。集群中的其他分片将不会被使用。因此它不会扩展。
这就是我们所说的“热键”,可能是各种痛苦和麻烦的来源。
在键名中添加类型前缀是Redis的一种常见模式,也是一种非常合适的处理方式。我们称之为keyspace,所以,这是一个不错的想法。
通常,我们使用冒号来分隔键空间,所以,如果我在存储大脚怪目击事件、UFO目击事件和Redis,你可以使用如下键空间:
冒号只是一个惯例--你喜欢怎么用就怎么用。不要让我告诉你如何生活!😉