Redis系列9:Geo 类型赋能亿级地图位置计算( 二 )


GEODIST key member1 member2 [unit]上述指令可以返回两个给定位置之间的距离,unit是距离单位,可选项,默认为m,枚举如下:

  • m:表示单位为米
  • km:表示单位为千米
  • mi:表示单位为英里
  • ft:表示单位为英尺
需要注意的是如果两个位置之间的其中一个不存在,那么会返回空值 。下面代码计算出东北饺子馆 和 兰州拉面 店铺之间的距离,大概是6.1公里 。
Redis系列9:Geo 类型赋能亿级地图位置计算

文章插图
redis> GEODIST food:location 东北饺子馆 兰州拉面"6184.15156"3.4GEORADIUS 获取给定经纬度的固定距离内的位置信息很多种应用场景是我登录了外卖APP,也确定了我自己所在的位置(即已确知经纬),需要获取一定距离范围内(比如10公里),所有的餐饮店 。这时候就使用到了 GEO 提供的 GEORADIUS指令了:根据输入的经纬度,查找以这个经纬度为中心的一定距离内的其他位置信息 。
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
  • key longitude latitude: 是前置条件,给定的经纬度信息,以及我要搜索的key
  • radius :距离半径,指的搜索的范围
  • m|km|ft|mi: 为给定的距离单位,有 米、千米、英尺、英里4种
  • [WITHCOORD] [WITHDIST] [WITHHASH]: 为返回的信息类型
    • WITHDIST: 在返回位置元素的同时,将位置元素与中心之间的距离也一并返回 。距离的单位和用户给定的范围单位保持一致 。
    • WITHCOORD: 将位置元素的经度和维度也一并返回 。
    • WITHHASH: 以 52 位有符号整数的形式,返回位置元素经过原始 geohash 编码的有序集合分值 。这个选项主要用于底层应用或者调试,实际中的作用并不大 。
  • ASC|DESC :可选参数,按照距离升序或者降序排列,即 由近到远(asc) 还是 由远到近(desc)
  • COUNT count:取数数量,避免获取到太多的信息,返回太多信息
所以如果需要获取 距离本人位置10公里半径内由近到远的美食店排序,按km单位计算,返回值带上距离信息,并只取前100个的信息,代码如下:
【Redis系列9:Geo 类型赋能亿级地图位置计算】redis> GEORADIUS food:location 115.791331 39.512000310 km WITHDISTASC COUNT 100"东北饺子馆"3.3421"兰州拉面"9.4571下图的绿色区域在固定半径(红圈)中搜索到了特定的几个目标位置:1、2、5、9、10 。
Redis系列9:Geo 类型赋能亿级地图位置计算

文章插图
3.5GEORADIUSBYMEMBER 按照位置名称获取与 GEORADIUS 的区别是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的,而不是像 GEORADIUS 那样,通过传入经度和纬度来决定中心点 。所以如下,已知兰州拉面和东北饺子馆的距离是6.1公里,根据兰州拉面获取10公里范围内的距离的美食店,可以获取到东北饺子馆和自己的位置:
redis> GEORADIUSBYMEMBER food:location "兰州拉面" 100 km WITHDIST"东北饺子馆"6.09127"兰州拉面"03.6 ZREM 删除关闭的店铺redis>ZREM food:location "兰州拉面"(integer) 14 总结