Redis 中的复杂数据结构

Complex data structures in Redis

我正在将 Node/Express 应用程序的后端从 MongoDB 重构为 Redis。

我的数据目前包含几十个 (~70) 个文档,每个文档由一个 NAME、一个缩写 ABBR、一个 GeoJSON LOCATION 和一个整数 PARAMETER 数组组成。每个文档的参数每隔几分钟更新一次,但其余属性保持不变。 PARAMETER 属性的长度可能会有所不同(也可以为空)。我想对数据执行许多查询以检查离给定点最近的位置,并显示名称、缩写和参数。

示例文档:

{ 
  _id: ObjectId("1"), 
  name: 'A place', 
  abbr: 'PLC', 
  location: { type: "Point", coordinates: [ -130.922, 33.289 ]},
  parameters: [3 4 28],
 }

我熟悉 Redis 中的 GEOADD 命令,但我不知道如何使用它来创建更复杂的数据结构来保存我的数据,因为如果我使用 GEOADD 命令指定一个位置,然后尝试使用 HMSET 为名称和缩写添加字段时,出现 WRONGTYPE 错误。

我感谢这个错误,因为我重视引用透明性,并且我喜欢认真对待类型。但我也认为我可能从根本上误解了 Redis 存储数据的方式。当我最初在概念上了解 Redis 后开始重构时,我设想能够以类似

的形式存储我的数据
1 name 'A Place' abbr 'PLC' location -130.922 33.289 parameters 3 4 28

或者,如果不完全是,一种方法可以轻松查询我的集合中位置的邻近度以及其他属性。

Redis核心数据结构不能嵌套。在您的示例中,您应该为每个级别使用不同的不同密钥(和数据结构),例如属性的哈希值,位置的 Geoset 和参数的可能另一个哈希值。

一旦你准备好了,你的查询应该包含三个读取来组成最终答案。