redis geo 地理位置系應用戰案例
專有名詞
geographic 地理
radius 半徑範圍; 半徑(距離); 用半徑度量的圓形面積
redis GEO實現
redis GEO實現主要包含了以下兩項技術:
1、使用geohash保存地理位置的坐標。
2、使用有序集合(sort set)保存地理位置的集合。(重點:基於sort set存儲)
redis GEO 方法列表
- geoadd
含義:
將指定的地理空間位置(緯度、經度、名稱)添加到指定的key中。
語法:
GEOADD key longitude latitude member [longitude latitude member]
實現:
geoadd city_clusters 116.405285 39.904989 beijing 121.472644 31.231706 shanghai
- geopos
含義:
從key裏返回所有給定位置元素的位置(經度和緯度)
語法:
GEOPOS key member [member ...]
實現:
127.0.0.1:6379> geopos city_clusters beijing shanghai
1) 1) "116.40528291463851929"
2) "39.9049884229125027"
2) 1) "121.47264629602432251"
2) "31.23170490709807012"
- geodist
含義:
返回兩個給定位置之間的距離。
備註:
指定單位的參數 unit 必須是以下單位的其中一個:m 表示單位為米。
km 表示單位為千米。
mi 表示單位為英裏。
ft 表示單位為英尺。
如果用戶沒有顯式地指定單位參數, 那麽 GEODIST 默認使用米作為單位。
語法:
GEODIST key member1 member2 [unit]
實現:
127.0.0.1:6379> geodist city_clusters beijing shanghai km
"1067.5980"
127.0.0.1:6379> geodist city_clusters beijing shanghai
"1067597.9668"
- geohash
含義:
返回一個或多個位置元素的 Geohash 表示。
作用:將二維的經緯度轉換成字符串。
語法:
GEOHASH key member [member ...]
實現:
127.0.0.1:6379> geohash city_clusters beijing
1) "wx4g0b7xrt0"
127.0.0.1:6379> geohash city_clusters beijing shanghai
1) "wx4g0b7xrt0"
2) "wtw3sjt9vg0"
- georadius
含義:
以給定的經緯度為中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。
備註:
範圍可以使用以下其中一個單位:
m 表示單位為米。
km 表示單位為千米。
mi 表示單位為英裏。
ft 表示單位為英尺。
在給定以下可選項時, 命令會返回額外的信息:
WITHDIST: 在返回位置元素的同時, 將位置元素與中心之間的距離也一並返回。 距離的單位和用戶給定的範圍單位保持一致。
WITHCOORD: 將位置元素的經度和維度也一並返回。
WITHHASH: 以 52 位有符號整數的形式, 返回位置元素經過原始 geohash 編碼的有序集合分值。 這個選項主要用於底層應用或者調試, 實際中的作用並不大。COUNT限定返回的記錄數
命令默認返回未排序的位置元素。 通過以下兩個參數, 用戶可以指定被返回位置元素的排序方式:
ASC: 根據中心的位置, 按照從近到遠的方式返回位置元素。
DESC: 根據中心的位置, 按照從遠到近的方式返回位置元素。
語法:
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
實現:
georadius city_clusters 114.546569 30.496705 1000 km withdist withcoord withhash count 3 asc
1) 1) "wuhan"
2) "0.0002"
3) (integer) 4051940381831537
4) 1) "114.54657107591629028"
2) "30.49670420836107354"
2) 1) "ezhou"
2) "34.4580"
3) (integer) 4051965036178493
4) 1) "114.88938957452774048"
2) "30.40377626121739496"
3) 1) "shanghai"
2) "666.1872"
3) (integer) 4054803464817068
4) 1) "121.47264629602432251"
2) "31.23170490709807012
- georadiusbymember
含義:
和 GEORADIUS 命令一樣, 都可以找出位於指定範圍內的元素, 但是 GEORADIUSBYMEMBER 的中心點是由給定的位置元素決定的, 而不是像 GEORADIUS 那樣, 使用輸入的經度和緯度來決定中心點
備註:
同georadius
語法:
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
實現:
georadiusbymember city_clusters ezhou 1000 km withcoord withdist withhash count 10 asc
1) 1) "ezhou"
2) "0.0000"
3) (integer) 4051965036178493
4) 1) "114.88938957452774048"
2) "30.40377626121739496"
2) 1) "wuhan"
2) "34.4578"
3) (integer) 4051940381831537
4) 1) "114.54657107591629028"
2) "30.49670420836107354"
3) 1) "shanghai"
2) "635.4470"
3) (integer) 4054803464817068
4) 1) "121.47264629602432251"
2) "31.23170490709807012"
redis geo 地理位置系應用戰案例