redis/rejson嵌套文档层次结构性能

xt0899hw  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(458)

我将记录存储为json文档,并根据记录类型组织成层次结构。在redis中存储这些数据的传统方法是:

customer:walmart   = {...}
customer:target    = {...}
order:po123        = {...}
person:bob         = {...]
person:tom         = {...}

然而,rejson(又称redisjson)允许我们高效地从路径查询子文档,因为它将json存储为哈希表的实际哈希表。因此,我可以将我的记录组织在一个实际的层次结构中,这也有助于在根目录处适应redis中不同的键限制。

["customer"]    = {"walmart": {...}, "target": {...}, "amazon": {...}}
["order"]       = {"po1": {...}, "po2": {...}, "po3": {...}}
["transaction"] = {"uuid1": {...}, "uuid2": {...}, "uuid3": {...}}
["person"]      = {"bob": {...}, "tom": {...}, "dave": {...}}
["widget"]      = {"this": {...}, "that": {...}, "other": {...}}

我定期检索一个或多个相同类型的记录。例如,我可能想要检索 target (一) customer )或者两者都有 bob 以及 tom ( person s) 是的。我很少从单一类型检索所有记录。
这两种不同方法之间的性能差异是什么?rejson是否使基于json路径(上面的“record”)检索子文档的效率与从根redis存储检索文档的效率大致相同?
rejson似乎没有检索的方法 bob 以及 tom 在单个命令/获取中。 mget 获取跨多个根redis键的公共路径。这与我想要的正好相反,这是我滥用redis的一个迹象。
即使使用rejson,以这种方式使用的故意的数据层次结构是否应该被视为由于性能惩罚而导致的不良实践?

ruarlubt

ruarlubt1#

这两种不同方法之间的性能差异是什么?rejson是否使基于json路径(上面的“record”)检索子文档的效率与从根redis存储检索文档的效率大致相同?
redisjson正在基于jsonpath检索子文档部分,因此jsonpath越复杂,它将增加的开销就越大。但是上面提到的简单路径不应该带来很大的开销。
rejson似乎没有办法在单个命令/获取中检索上述bob和tom。
redisjson.get支持多路径,因此可以调用 JSON.GET customer .bob .tom . 另外,即将发布的json2.0包含对jsonpath的完全支持,因此您应该能够运行 JSON.GET customer .["bob"|"tom"] 即使使用rejson,以这种方式使用的故意的数据层次结构是否应该被视为由于性能惩罚而导致的不良实践?
这里您应该考虑的是,如果您使用redis cluster,是否需要所有“部分”都位于同一个shard上,是否需要原子/事务更新这些部分?

相关问题