Redis:按分数排序的集合的交集

Redis: intersection of sorted sets by score

我想在 Redis 数据存储中存储位置三元组,但也想让它们可搜索。这将使进行范围查询成为可能,例如 'give me al points with 1 < x 3 and y > 2'。因此,我使用排序集的组合。

每个三元组都像这样保存在 Redis 中(例如位置 A,x = 1,y = 2,z = 3):

hset /locations/A x "1"
hset /locations/A y "2"
hset /locations/A z "3"
hset /locations/A payload "{ ...some json payload... }"
zadd /locations:x 1 locations/A
zadd /locations:y 2 locations/A
zadd /locations:z 3 locations/A

这样,我可以轻松找到所有位置(或位置路径),例如x 值介于 4 和 5 之间:

zrangebyscore /locations:x 4 5

或所有位置,例如1 到 3 之间的 y 值:

zrangebyscore /locations:x 1 3

当我尝试匹配 x 值介于 4 到 5 和 y 值介于 1 到 3 之间的所有位置时出现问题,因为那时我必须对 Redis 进行两次查询,随后将这些值与 Javascript 在 NodeJS 中,当定义了很多位置时,这可能会非常耗时。有人遇到过这样的问题吗?

我尝试了 zinterstore 和 zunionstore,但还没有找到满意的解决方案。我考虑过将 zrangebyscores 存储到一个临时集合中,然后做一个 zinterstore,但是没有找到一个 Redis 命令将 zrangebyscore 的输出直接存储到 Redis(在同一个命令中)。

我想忽略用例(位置 paths/distances)本身,因为有多种行之有效的方法可以应对这一挑战,也可以使用 Redis(搜索地理空间,你会找到),而是专注于关于技术。

因此,假设您要发明并实施自己的地理逻辑,这是解决 scoring/ranging/intersecting/... 这些排序中涉及的挑战的最有效方法(除了修改 Redis 的代码)集合将在 Lua 脚本中。这就是您可能用流行语称呼的 "Data Gravity" - 处理器靠近数据,因此访问和操作数据速度最快并且不需要网络。

在这样的脚本中,例如,您可以将 ZRANGEBYSCORE 的结果存储在局部变量中,在那里和使用它们做任何您需要做的事情,并将最终结果回复给 (Node.js) 客户端.

做吧,做你的两个查询,Redis 很快而且不在乎。然后javascriptSimplest code for array intersection in javascript求两者都存在的值