GEO 地理位置
2023-3-24
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
在Redis 3.2版本中,新增了存储地理位置信息的功能,即GEO(英文全称 geographic),它的底层通过Redis有序集合(zset)实现。不过Redis GEO并没有与zset共用一套的命令,而是拥有自己的一套命令。
Redis GEO 有很多应用场景,举一个简单的例子,外卖或者打车软件上会显示“店家距离你有多少米”或者“司机师傅距离你有多远”,类似这种功能就可以使用 Redis GEO 实现。数据库中存放着商家所处的经纬度,位置则由手机定位获取,这样 APP 就计算出了最终的距离。再比如微信中附近的人、摇一摇、实时定位等功能都依赖地理位置实现。
GEO 提供以下操作命令:
命令
说明
GEOADD
将指定的地理空间位置(纬度、经度、名称)添加到指定的 key 中。
GEOPOS
从 key 里返回所有给定位置元素的位置(即经度和纬度)
GEODIST
返回两个地理位置间的距离,如果两个位置之间的其中一个不存在, 那么命令返回空值。
GEORADIUS
根据给定地理位置坐标(经纬度)获取指定范围内的地理位置集合。
GEORADIUSBYMEMBER
根据给定地理位置(具体的位置元素)获取指定范围内的地理位置集合。
GEOHASH
获取一个或者多个的地理位置的 GEOHASH 值。
ZREM
通过有序集合的 zrem 命令实现对地理位置信息的删除。
 
 
GEOADD
将指定的地理空间位置(纬度、经度、名称)添加到指定的 key 中。语法格式如下:
  • longitude:位置地点所处的经度;
  • latitude:位置地点所处的纬度;
  • member:位置名称。
将给定的经纬度的位置名称(纬度、经度、名字)与 key 相对应,这些数据以有序集合的形式进行储存。
GEOADD命令以标准的x,y形式接受参数, 所以用户必须先输入经度,然后再输入纬度。GEOADD命令能够记录的坐标数量是有限的,如果位置非常接近两极(南极/北极)区域,那么将无法被索引到。因此当您输入经纬度时,需要注意以下规则:
  • 有效的经度介于 -180 度至 180 度之间。
  • 有效的纬度介于 -85.05112878 度至 85.05112878 度之间。
注意:如果您输入一个超出范围的经纬度时,GEOADD 命令将返回一个错误:
 
 
GEODIST
该命令用于获取两个地理位置间的距离。返回值为双精度浮点数,其语法格式如下:
参数 unit 是表示距离单位,取值如下所示:
  • m 表示单位为米;
  • km 表示单位为千米;
  • mi 表示单位为英里;
  • ft 表示单位为英尺。
注意:如果没有指出距离单位,那么默认取值为m
注意:计算举例时存在 0.5% 左右的误差,这是由于 Redis GEO 把地球假设成了完美的球体。
 
 
GEORADIUS
以给定的经纬度为中心,计算出 key 包含的地理位置元素与中心的距离不超过给定最大距离的所有位置元素,并将其返回。
参数说明:
  • WITHDIST :在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
  • WITHCOORD :返回位置元素的经度和维度。
  • WITHHASH :采用 GEOHASH 对位置元素进行编码,以 52 位有符号整数的形式返回有序集合的分值,该选项主要用于底层调试,实际作用不大。
  • COUNT:指定返回位置元素的数量,在数据量非常大时,可以使用此参数限制元素的返回数量,从而加快计算速度。
注意:该命令默认返回的是未排序的位置元素。通过 ASC 与 DESC 可让返回的位置元素以升序或者降序方式排列。
 
GEORADIUSBYMEMBER
根据给定的地理位置坐标(即经纬度)获取指定范围内的位置元素集合:
  • m :米,默认单位;
  • km :千米(可选);
  • mi :英里(可选);
  • ft :英尺(可选);
  • ASC:根据距离将查找结果从近到远排序;
  • DESC:根据距离将查找结果从远到近排序。
该命令与 GEORADIUS 命令相似,不过它选择的中心的是具体的位置元素,而非经纬度坐标:
 
GEOHASH
返回一个或多个位置元素的哈希字符串,该字符串具有唯一 ID 标识,它与给定的位置元素一一对应:
 
ZREM
用于删除指定的地理位置元素:
 
 
 

应用场景

滴滴叫车

假设车辆 ID 是 33,经纬度位置是(116.034579,39.030452),可以用一个 GEO 集合保存所有车辆的经纬度,集合 key 是 cars:locations。
执行下面的这个命令,就可以把 ID 号为 33 的车辆的当前经纬度位置存入 GEO 集合中:
当用户想要寻找自己附近的网约车时,LBS 应用就可以使用 GEORADIUS 命令。
例如,LBS 应用执行下面的命令时,Redis 会根据输入的用户的经纬度信息(116.054579,39.030452 ),查找以这个经纬度为中心的 5 公里内的车辆信息,并返回给 LBS 应用。
 
  • Redis
  • HyperLoglog 基数统计Stream 消息队列
    目录