1. 程式人生 > >企業級Redis開發運維從入門到實踐 (14)— GEO

企業級Redis開發運維從入門到實踐 (14)— GEO

GEO是什麼

GEO(地理資訊定位):儲存經緯度,計算兩地距離,範圍計算等。

應用場景

  • 類似微信中搖一搖,找出範圍內的使用者。
  • 類似美團中酒店查詢,找出範圍內的酒店。在這裡插入圖片描述

5個城市經緯度

城市 緯度 經度 簡稱
北京 116.28 39.55 beijing
天津 117.12 39.08 tianjin
石家莊 114.29 38.02 shijiazhuang
唐山 118.01 39.38 tangshan
保定 115.29 38.51 baoding

GEO的相關命令

geoadd
  • GEOADD key longitude latitude member [longitude latitude member …]:增加地理位置資訊(緯度、經度、名字)。
  • 有效的經度介於 -180 度至 180 度之間。
  • 有效的緯度介於 -85.05112878 度至 85.05112878 度之間。
  • 時間複雜度:每新增一個元素的複雜度為 O(log(N)) , 其中 N 為鍵裡面包含的位置元素數量。
redis> geoadd cities:locations 116.26 39.55 beijing
(integer) 1

# 再新增一次依然可以新增成功
redis> geoadd cities:locations 116.26 39.55 beijing
(integer) 1

# 新增多個地理位置
redis> geoadd cities:locations 17.12 39.08 tianjin 14.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
(integer) 4
geopos
  • geopos key member [member …]:獲取地理位置資訊。
  • 時間複雜度:獲取每個位置元素的複雜度為 O(log(N)) , 其中 N 為鍵裡面包含的位置元素數量。
redis> geoadd cities:locations tianjin
1) 1)"17.12000042200088501"
	   2)"39.0800000535766543"
geodist
  • geodist key member1 member2 [unit]:獲取兩個地理位置的距離。
  • unit:m(米)、km(千米)、mi(英里)、ft(尺)。
  • 複雜度:O(log(N))。
redis> geodist cities:locations tianjin beijing km
"89.2061"
georadius、georadiusbymember
  • georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]:以給定的經緯度為中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。
  • georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]:這個命令和 georadius命令一樣, 都可以找出位於指定範圍內的元素, 但是 georadiusbymember 的中心點是由給定的位置元素決定的, 而不是像 georadius那樣, 使用輸入的經度和緯度來決定中心點。
  • withcoord:返回結果中包含經緯度。
  • withdist:返回結果中包含距離中心節點位置。
  • withhash:返回結果中包含geohash。
  • COUNT count:指定返回結果數量。
  • asc|desc:返回結果按照距離中心節點的距離做升序或者降序。
  • store key:將返回結果的地理位置資訊儲存再指定鍵。
  • storedist key:將返回結果距離中心節點的距離儲存到指定鍵。
redis> georadiusbymember cities:locations beijing 150 km
1)  "beijing"
2)  "tianjin"
3)  "tangshan"
4)  "baoding"

相關說明

  1. since 3.2+,3.2及以上版本增加geo。
  2. type geoKey = zset,geo使用有序集合實現的。
  3. 沒有刪除API:zrem key member。