Redis 08 地理位置

Redis 的 GEO 特性在 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存起来。通常用以实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。

GEO 的数据类型为 zset。总共有六个常用命令:geoaddgeoposgeodistgeoradiusgeoradiusbymembergethash

官方文档:https://www.redis.net.cn/order/3685.html

赋值

添加

geoadd

将给定的空间元素(纬度、经度、名字)添加到指定的键里面。

geoadd key longitude latitude member ...
  • 这些数据会以有序集的形式被储存在键里面,从而使得 georadiusgeoradiusbymember 这样的命令可以在之后通过位置查询取得这些元素。
  • geoadd 命令以标准的x,y格式接受参数,所以用户必须先输入经度,然后再输入纬度。
  • geoadd 能够记录的坐标是有限的:非常接近两极的区域无法被索引。
  • 有效的经度介于 -180 ~ 180 度之间,有效的纬度介于 -85.05112878 ~ 85.05112878 度之间。当输入超出范围的经度或者纬度,geoadd 将返回一个错误。
127.0.0.1:6379> geoadd china:city 116.23 40.22 北京
(integer) 1
127.0.0.1:6379> geoadd china:city 121.48 31.40 上海 113.88 22.55 深圳 120.21
(error) ERR syntax error
127.0.0.1:6379> geoadd china:city 121.48 31.40 上海 113.88 22.55 深圳 120.21 30.20 杭州
(integer) 3
127.0.0.1:6379> geoadd china:city 106.54 29.40 重庆 108.93 34.23 西安 114.02 30.58 武汉
(integer) 3

取值

经纬度

geopos

从 key 里返回所有给定位置元素的位置(经度和纬度)

geopos key member [member...]
127.0.0.1:6379> geopos china:city 北京
1) 1) "116.23000055551528931"
   2) "40.2200010338739844"
127.0.0.1:6379> geopos china:city 重庆 上海
1) 1) "106.54000014066696167"
   2) "29.39999880018641676"
2) 1) "121.48000091314315796"
   2) "31.40000025319353938"
127.0.0.1:6379> geopos china:city 云南
1) (nil)

两个位置的距离

geodist

返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在,那么命令返回空值。

geodist key member1 member2 [unit]

指定单位的参数 unit 必须是以下单位的其中一个:

  • m 表示单位为米
  • km 表示单位为千米
  • mi 表示单位为英里
  • ft 表示单位为英尺

如果用户没有显式地指定单位参数,那么 geodist 默认使用作为单位。

geodist 在计算距离时会假设地球为完美的球形,在极限情况下,这一假设最大会造成 0.5% 的误差。

127.0.0.1:6379> geodist china:city 北京 上海
"1088785.4302"
127.0.0.1:6379> geodist china:city 北京 上海 km
"1088.7854"
127.0.0.1:6379> geodist china:city 重庆 北京 km
"1491.6716"

半径内的元素

georadius

以给定的经纬度为中心,找出某一半径内的元素。

georadius key longitude latitude radius m|km|ft|mi [withcoord][withdist][withhash][asc|desc][count count]

在 china:city 中寻找坐标 100 30 半径为 1000km 的城市

127.0.0.1:6379> georadius china:city 100 30 1000 km
1) "\xe9\x87\x8d\xe5\xba\x86"
2) "\xe8\xa5\xbf\xe5\xae\x89"

此时中文输出为乱码,需要在连接 redis-cli 时增加参数 --raw ,可以强制输出中文,不然会乱码。

[root@sail ~]# redis-cli --raw
127.0.0.1:6379> georadius china:city 100 30 1000 km
重庆
西安

withdist 返回位置名称和中心距离

127.0.0.1:6379> georadius china:city 100 30 1000 km withdist
重庆
635.2850
西安
963.3171

withcoord 返回位置名称和经纬度

127.0.0.1:6379> georadius china:city 100 30 1000 km withcoord
重庆
106.54000014066696167
29.39999880018641676
西安
108.92999857664108276
34.23000121926852302

withdist withcoord 返回位置名称 距离 和 经纬度

count 限定寻找个数

127.0.0.1:6379> georadius china:city 100 30 1000 km withcoord withdist count 1
重庆
635.2850
106.54000014066696167
29.39999880018641676
127.0.0.1:6379> georadius china:city 100 30 1000 km withcoord withdist count 2
重庆
635.2850
106.54000014066696167
29.39999880018641676
西安
963.3171
108.92999857664108276
34.23000121926852302

指定范围内的元素

georadiusbymember

找出位于指定范围内的元素,中心点是由给定的位置元素决定

georadiusbymember key member radius m|km|ft|mi [withcoord][withdist][withhash][asc|desc][count count]

北京 1000 km 内的城市

127.0.0.1:6379> georadiusbymember china:city 北京 1000 km
北京
西安

上海 400 km 内的城市

127.0.0.1:6379> georadiusbymember china:city 上海 400 km
杭州
上海

经纬度字符串

geohash

将二维经纬度转换为一维字符串,字符串越长表示位置更精确,两个字符串越相似表示距离越近。

geohash key member [member...]
127.0.0.1:6379> geohash china:city 北京 重庆
wx4sucu47r0
wm5z22h53v0
127.0.0.1:6379> geohash china:city 北京 上海
wx4sucu47r0
wtw6sk5n300

删除

指定元素

zrem

GEO 没有提供删除成员的命令,但是因为 GEO 的底层实现是 zset,所以可以借用 zrem 命令实现对地理位置信息的删除。

# 查看全部的元素
127.0.0.1:6379> zrange china:city 0 -1
chongqing
重庆
西安
深圳
武汉
杭州
上海
北京
# 移除元素
127.0.0.1:6379> zrem china:city 上海
1
# 查看全部的元素
127.0.0.1:6379> zrange china:city 0 -1
重庆
西安
深圳
武汉
杭州
北京

参考

https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0

版本

6.2.6

posted @ 2022-05-17 12:10  天航星  阅读(54)  评论(0编辑  收藏  举报