【问题标题】:Redis: intersection of sorted sets by scoreRedis:按分数排序集的交集
【发布时间】:2015-05-04 14:25:58
【问题描述】:

我想将位置三元组存储在 Redis 数据存储中,但也想让它们可搜索。这样就可以进行范围查询,例如“给我 1 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

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

zrangebyscore /locations:x 4 5

或所有位置,例如y 值介于 1 和 3 之间:

zrangebyscore /locations:x 1 3

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

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

【问题讨论】:

    标签: node.js google-app-engine redis node-redis sortedset


    【解决方案1】:

    我想忽略用例(位置路径/距离)本身,因为有多种经过验证的方法可以解决这一挑战,包括 Redis(搜索地理空间,你会找到),而是专注于技术。

    因此,假设您要发明和实施自己的地理逻辑,最有效的方法(不修改 Redis 的代码)来解决评分/测距/相交/...这些排序集所涉及的挑战在 Lua 脚本中。这就是您可能流行的所谓“数据引力”——处理器靠近数据,因此访问和操作数据的速度最快,并且不需要网络。

    例如,在此类脚本中,您可以将 ZRANGEBYSCORE 的结果存储在局部变量中,在那里和使用它们执行您需要执行的任何操作,并将最终结果回复给 (Node.js) 客户端。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-01-26
        • 1970-01-01
        • 1970-01-01
        • 2016-10-22
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 2014-06-05
        相关资源
        最近更新 更多