1. 程式人生 > 其它 >Redis 08 地理位置

Redis 08 地理位置

本文章基於 Redis 6.2.6

Redis 的 GEO 特性在 3.2 版本中推出, 這個功能可以將使用者給定的地理位置資訊儲存起來。

通常用以實現諸如附近位置、搖一搖這類依賴於地理位置資訊的功能。

geo 的資料型別為 zset。

GEO 的資料結構總共有六個常用命令: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
重慶
西安
深圳
武漢
杭州
北京