Redis。不同键中两个成员之间的距离
Redis. Distance between two members in different keys
我在 redis 第一个 "DRIVERS" 第二个 "ORDERS" 中有两个键 (geo zset) 和其中的成员。
是否可以计算 DRIVERS 中的成员与 ORDERS 中的成员之间的距离?
手册https://redis.io/commands/geodist说只能在一键成员之间。
没有 built-in 方法可以做到这一点。但是,您可以尝试以下两种解决方案。
- 使用
GEOPOS
命令获取driver的位置(经度和纬度)和顺序。然后你可以自己计算它们之间的距离。或者您可以将结果放入一个新的 GEOSET
并让 Redis 进行计算。
- 将 driver 和订单保存在同一个
GEOSET
中,例如GEOADD geo long1 lat1 driver:id
、GEOADD geo long2 lat2 Order:id
由于 GEOSETS 是排序集,您可以通过执行 ZUNIONSTORE 创建一个临时键,然后对这些键执行操作
GEODIST 只会计算同一Key 内的地理空间对象之间的距离。但是,地理空间对象的后备存储是一个有序集。使用 ZUNIONSTORE 可以组合这两个集合,并且可以对结果集合执行 GEODIST。
> ZUNIONSTORE result 2 DRIVERS ORDERS aggregate min
> GEODIST result "driver_1" "order_1" km
注意:聚合最小值选项是必需的,否则出现在多个集合中的任何元素都将聚合其分数。对于地理空间数据,这会导致该点移动其经度和纬度位置。
我在 redis 第一个 "DRIVERS" 第二个 "ORDERS" 中有两个键 (geo zset) 和其中的成员。 是否可以计算 DRIVERS 中的成员与 ORDERS 中的成员之间的距离? 手册https://redis.io/commands/geodist说只能在一键成员之间。
没有 built-in 方法可以做到这一点。但是,您可以尝试以下两种解决方案。
- 使用
GEOPOS
命令获取driver的位置(经度和纬度)和顺序。然后你可以自己计算它们之间的距离。或者您可以将结果放入一个新的GEOSET
并让 Redis 进行计算。 - 将 driver 和订单保存在同一个
GEOSET
中,例如GEOADD geo long1 lat1 driver:id
、GEOADD geo long2 lat2 Order:id
由于 GEOSETS 是排序集,您可以通过执行 ZUNIONSTORE 创建一个临时键,然后对这些键执行操作
GEODIST 只会计算同一Key 内的地理空间对象之间的距离。但是,地理空间对象的后备存储是一个有序集。使用 ZUNIONSTORE 可以组合这两个集合,并且可以对结果集合执行 GEODIST。
> ZUNIONSTORE result 2 DRIVERS ORDERS aggregate min
> GEODIST result "driver_1" "order_1" km
注意:聚合最小值选项是必需的,否则出现在多个集合中的任何元素都将聚合其分数。对于地理空间数据,这会导致该点移动其经度和纬度位置。