核心知識點:
1.GEO是利用zset來存儲地理位置信息,可以用來計算地理位置之間的距離,也可以做統計;
2.命令:geoadd geopos geodist geohash georadius/georadiusbymember;
3.geohash字符串越長越精准,字符串越相近距離越近。
Redis3.2版本提供了GEO(地理信息定位)功能,支持存儲地理位置信息用來實現諸如附近位置、
搖一搖這類依賴於地理位置信息的功能,對於需要實現這些功能的開發者來說是一大福音。
GEO功能是Redis的另一位作者Matt Stancliff借鑒NoSQL數據庫Ardb實現的,Ardb的作者來自中國,它提供了優秀的GEO功能。
使用GEO的主要命令如下:
1.增加地理位置信息
geoadd key longitude latitude member [longitude latitude member ...]
longitude、latitude、member分別是該地理位置的經度、緯度、成員。本篇文章以下表的5個城市為例:

127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijing
(integer) 1
127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijing
(integer) 0
返回的結果代表添加成功的個數,如果返回0代表已經存在。
geoadd還可以用來更新地理位置信息,雖然返回0,geoadd可以同時添加多個地理位置信息。
127.0.0.1:6379> geoadd cities:locations 117.12 39.08 tianjin 114.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
(integer) 4
2.獲取地理位置信息
geopos key member [member ...]
獲取地理位置信息:
127.0.0.1:6379> geopos cities:locations tianjin
1) 1) "117.12000042200088501"
2) "39.0800000535766543"
3.獲取兩個地理位置的距離
geodist key member1 member2 [unit]
其中unit代表返回結果的單位,包含以下四種:
- m(meters)代表米
- km(kilometers)代表公里
- mi(miles)代表英里
- ft(feet)代表尺
下面結算北京到天津的距離,並以公里為單位:
127.0.0.1:6379> geodist cities:locations beijing tianjin km
"89.2061"
4.獲取指定位置范圍內的地理信息位置集合
georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
georadiusbymember key member radiusm m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
georadius和georadiusbymember兩個命令的作用是一樣的,都是以一個地理位置為中心算出指定半徑內的其它地理信息位置,
不同的是georadius命令的中心位置給出了具體的經緯度,georadiusbymember只需給出成員即可,
其中radius m|km|ft|mi是必須參數,指定了半徑,帶單位,下面是它可選參數的解釋:
- withcoord:返回結果中包含經緯度;
- withdist:返回結果中包含離中心節點位置的距離;
- withhash:返回結果中包含geohash;
- COUNT count:指定返回結果的數量;
- asc|desc:指定結果按照離中心節點的距離做升序或者降序;
- store key:將返回結果的地理位置信息保存到指定鍵;
- storedist key:將返回結果離中心離中心節點的距離保存到指定鍵。
127.0.0.1:6379> georadiusbymember cities:locations beijing 100 km #距離北京100km內的城市
1) "beijing"
2) "tianjin"
5.獲取geohash
geohash key member [member ... ]
Redis使用geohash將二維經緯度轉換為一維字符串:
127.0.0.1:6379> geohash cities:locations beijing
1) "wx48ypbe2q0"
geohash有如下特點:
- GEO的數據類型為zset,Redis將所有地理位置信息的geohash存放在zset中。
- 字符串越長,表示的位置更精准。
- 兩個字符串越相似,它們之間的距離越近,Redis利用字符串前綴匹配算法實現相關命令
- geohash編碼和經緯度是可以相互轉換的。
Redis正是使用有序集合並結合geohash的特性實現了GEO的若干命令。

6.刪除地理位置信息
zrem key member
GEO沒有提供刪除成員的命令,但是因為GEO的底層實現是zset,所有可以借用zrem實現對地理位置信息的刪除。
127.0.0.1:6379> zrem cities:locations tangshan
(integer) 1
