【发布时间】: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