Skip to content

GEO类型相关命令

用于存储地理位置信息,Redis提供支持对存储的信息进行操作。 应用场景: 交友软件中附近的小姐姐、外卖软件中附近的美食店铺、高德地图附近的核酸检查点 获取经纬度数据:https://lbs.amap.com/tools/picker

1. GEOADD命令

语法: GEOADD key [NX | XX] [CH] longitude latitude member [longitude latitude member ...]
用于将给定的空间元素(纬度、经度、名字)添加到指定的键里面。这些数据会以有序集合的形式被储存在键里面,GEOADD命令以标准的x,y格式接受参数, 所以用户必须先输入经度,然后再输入纬度。GEOADD能够记录的坐标是有限的, 非常接近两极的区域是无法被索引的经纬度的范围:

  • 有效的经度介于 -180 度至 180 度之间。
  • 有效的纬度介于 -85.05112878 度至 85.05112878 度之间。
    返回值为新添加到键里面的空间元素数量,不包括那些已经存在但是被更新的元素。 当用户尝试输入一个超出范围的经度或者纬度时, GEOADD命令将返回一个错误。

提示

没有GEODEL命令,因为可以使用ZREM来删除元素。Geo底层的索引结构是sorted set

其中参数说明:

  • XX: 只更新不添加元素成员。
  • NX: 只添加元素成员不做更新处理。
  • CH: (CH是changed的缩写),返回值由新增元素数目变为更新的元素总数,更新的元素由新增的元素和已存在被修改的组成。
sh
127.0.0.1:6379> geoadd city 104.100227 30.675702 电子科技大学 104.077774 30.655544 春熙路
(integer) 2
127.0.0.1:6379> type city
zset

2. GEOPOS命令

语法: GEOPOS key [member [member ...]]
用于从给定的key里返回所有指定member的位置(经纬度),不存在的返回nil。

sh
127.0.0.1:6379> geopos city 电子科技大学 春熙路
1) 1) "104.10022526979446411"
   2) "30.67570114719126906"
2) 1) "104.07777518033981323"
   2) "30.65554504453221085"

3. GEODIST命令

语法: GEODIST key member1 member2 [M | KM | FT | MI]
用于计算并返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在,那么命令返回空值。
参数说明:

  • M:米,默认单位。
  • KM :千米。
  • MI :英里。
  • FT :英尺。
sh
127.0.0.1:6379> geodist city 电子科技大学 春熙路
"3104.7264"
127.0.0.1:6379> geodist city 电子科技大学 春熙路 km
"3.1047"
127.0.0.1:6379> geodist city 电子科技大学 春熙路 m
"3104.7264"

4. GEORADIUS命令(已过时)

语法: GEORADIUS key longitude latitude radius <M | KM | FT | MI>[WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC][STORE key | STOREDIST key]
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
自Redis 6.2.0之后被置为过时,用GEOSEARCH命令或者GEOSEARCHSTORE命令配合BYRADIUS参数作用等效。 参数说明:

  • M: 米,默认单位。
  • KM: 千米。
  • MI: 英里。
  • FT: 英尺。
  • WITHCOORD: 将位置元素的经度和维度也一并返回。
  • WITHDIST: 在返回位置元素的同时,将位置元素与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。
  • WITHHASH: 以52位有符号整数的形式,返回位置元素经过原始geohash编码的有序集合分值。这个选项主要用于底层应用或者调试,实际中的作用并不大。
  • COUNT: 限定返回的记录数。
  • ASC: 根据中心的位置,按照从近到远的方式返回位置元素
  • DESC: 根据中心的位置,按照从远到近的方式返回位置元素。
  • STORE key: 将返回结果的地理位置信息保存到指定key。
  • STOREDIST key: 将返回结果离中心点的距离保存到指定key。

提示

如果GEORADIUSGEORADIUSBYMEMBER带参数STORESTOREDIST选项,集群中执行只会查询(写入)主实例,QPS过高时容易造成主实例读写压力过大。为解决这个问题,在Redis 3.2.10和Redis 4.0.0中,分别新增了GEORADIUS_ROGEORADIUSBYMEMBER_RO两个只读命令。

sh
## 距离我最近的5个景区
127.0.0.1:6379> georadius city 104.036488 30.670331 5 KM WITHCOORD WITHDIST WITHHASH COUNT 5 ASC
宽窄巷子  ## 地理名称
1.7616   ## 和指定经纬度的距离
4025771288393188   ## 52位有符号整数hash
104.05329734086990356  ## 经度
30.66386653409832519   ## 纬度
人民公园
2.4998
4025771277493459
104.05740112066268921
30.65685803009274935
四川科技馆
3.0091
4026137794328132
104.06567841768264771
30.66025709116741638
春熙路
4.2788
4026137790318271
104.07777518033981323
30.65554504453221085

5. GEORADIUSBYMEMBER命令(已过时)

语法: GEORADIUSBYMEMBER key member radius <M | KM | FT | MI> [WITHCOORD][WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key| STOREDIST key]
该命令和GEORADIUS功能一样,区别是GEORADIUSBYMEMBER以给定的位置元素为中心,而不是使用经纬度来决定中心点。 自Redis 6.2.0之后被置为过时,用GEOSEARCH命令或者GEOSEARCHSTORE命令配合BYRADIUS参数作用等效。

sh
## 距离四川科技馆最近的5个地名列表
127.0.0.1:6379> georadiusbymember city 四川科技馆  5 KM WITHCOORD WITHDIST WITHHASH COUNT 5 ASC
四川科技馆
0.0000
4026137794328132
104.06567841768264771
30.66025709116741638
人民公园
0.8776
4025771277493459
104.05740112066268921
30.65685803009274935
宽窄巷子
1.2508
4025771288393188
104.05329734086990356
30.66386653409832519
春熙路
1.2706
4026137790318271
104.07777518033981323
30.65554504453221085

6. GEOHASH命令

语法: GEOHASH key [member [member ...]]
用于返回一个或多个位置元素的Geohash字符串,每个Geohash字符串长度都是11位。Redis GEO底层使用geohash来保存地理位置的坐标。

sh
127.0.0.1:6379> geohash city 电子科技大学 春熙路
1) "wm6n8b76zj0"
2) "wm6n2kej7z0"

7. GEOSEARCH命令

语法: GEOSEARCH key <FROMMEMBER member | FROMLONLAT longitude latitude><BYRADIUS radius <M | KM | FT | MI> | BYBOX width height <M | KM | FT | MI>> [ASC | DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]
返回key排序集中给定形状指定的区域的边界内的成员,该命令扩展了GEORADIUS命令,因为它除了圆形区域搜索还支持在矩形区域内搜索。

  1. 中心点类型参数:
  • FROMMEMBER: 从key排序集中指定成员作为中心点
  • FROMLONLAT: 使用经纬度作为中心点
  1. 区域搜索范围形状参数:
  • BYRADIUS: 圆形范围查找
  • BYBOX: 矩形内搜索
  1. 可选参数说明:
  • COUNT: 限定返回的记录数。
  • ASC: 根据中心的位置,按照从近到远的方式返回位置元素
  • DESC: 根据中心的位置,按照从远到近的方式返回位置元素。
  • ANY: 不经过排序直接返回,可能第一个不是最近或者最远的位置元素。
  • WITHCOORD: 将位置元素的经度和维度也一并返回。
  • WITHDIST: 在返回位置元素的同时,将位置元素与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。
  • WITHHASH: 以52位有符号整数的形式,返回位置元素经过原始geohash编码的有序集合分值。这个选项主要用于底层应用或者调试,实际中的作用并不大。
  • M: 米,默认单位。
  • KM: 千米。
  • MI: 英里。
  • FT: 英尺。
sh
127.0.0.1:6379> geosearch city fromlonlat 104.036488 30.670331 bybox 30 30 km asc count 4 withcoord withdist withhash
宽窄巷子
1.7616
4025771288393188
104.05329734086990356
30.66386653409832519
人民公园
2.4998
4025771277493459
104.05740112066268921
30.65685803009274935
四川科技馆
3.0091
4026137794328132
104.06567841768264771
30.66025709116741638
春熙路
4.2788
4026137790318271
104.07777518033981323
30.65554504453221085

8. GEOSEARCHSTORE命令

语法: GEOSEARCHSTORE destination source <FROMMEMBER member | FROMLONLAT longitude latitude><BYRADIUS radius <M | KM | FT | MI> | BYBOX width height <M | KM | FT | MI>> [ASC | DESC][COUNT count [ANY]] [STOREDIST]
和GEOSEARCH类似,区别是额外支持存储数据到指定的destination中。默认存到destination有序集信息来自source有序集的成员元素,如果加上STOREDIST参数则将距离信息保存到destination中。

sh
127.0.0.1:6379> geosearchstore result_geo1 city fromlonlat 104.036488 30.670331 bybox 30 30 km asc count 5
5
127.0.0.1:6379> zrange result_geo1 0 -1 withscores
人民公园
4025771277493459
宽窄巷子
4025771288393188
春熙路
4026137790318271
四川科技馆
4026137794328132
电子科技大学
4026137890926485
127.0.0.1:6379> zrange result_geo2 0 -1 withscores
宽窄巷子
1.761583143807442
人民公园
2.4998073916782375
四川科技馆
3.009116238443396
春熙路
4.278822990616175
电子科技大学
6.126606617460327