企業級Redis開發運維從入門到實踐 (14)— GEO
阿新 • • 發佈:2018-12-12
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"
相關說明
- since 3.2+,3.2及以上版本增加geo。
- type geoKey = zset,geo使用有序集合實現的。
- 沒有刪除API:zrem key member。