<b>3.8 geo</b>
redis 3.2版本提供了geo(地理資訊定位)功能,支援存儲地理位置資訊用來實作諸如附近位置、搖一搖這類依賴于地理位置資訊的功能,對于需要實作這些功能的開發者來說是一大福音。geo功能是redis的另一位作者matt stancliff借鑒nosql資料庫ardb實作的,ardb的作者來自中國,它提供了優秀的geo功能。
1.增加地理位置資訊
geoadd key longitude latitude member
[longitude latitude member ...]
longitude、latitude、member分别是該地理位置的經度、緯度、成員,表3-7展示5個城市的經緯度。
表3-7 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
cities:locations是上面5個城市地理位置資訊的集合,現向其添加北京的地理位置資訊:
127.0.0.1:6379> geoadd cities:locations
116.28 39.55 beijing
(integer) 1
傳回結果代表添加成功的個數,如果cities:locations沒有包含beijing,那麼傳回結果為1,如果已經存在則傳回0:
(integer) 0
如果需要更新地理位置資訊,仍然可以使用geoadd指令,雖然傳回結果為0。geoadd指令可以同時添加多個地理位置資訊:
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
tianjin beijing km
"89.2061"
4.?擷取指定位置範圍内的地理資訊位置集合
georadius key longitude latitude
radiusm|km|ft|mi [withcoord] [withdist]
[withhash] [count count] [asc|desc] [store key] [storedist key]
georadiusbymember key member radiusm|km|ft|mi [withcoord] [withdist]
georadius和georadiusbymember兩個指令的作用是一樣的,都是以一個地理位置為中心算出指定半徑内的其他地理資訊位置,不同的是georadius指令的中心位置給出了具體的經緯度,georadiusbymember隻需給出成員即可。其中radiusm|km|ft|mi是必需參數,指定了半徑(帶機關),這兩個指令有很多可選參數,如下所示:
withcoord:傳回結果中包含經緯度。
withdist:傳回結果中包含離中心節點位置的距離。
withhash:傳回結果中包含geohash,有關geohash後面介紹。
count count:指定傳回結果的數量。
asc|desc:傳回結果按照離中心節點的距離做升序或者降序。
store key:将傳回結果的地理位置資訊儲存到指定鍵。
storedist key:将傳回結果離中心節點的距離儲存到指定鍵。
下面操作計算五座城市中,距離北京150公裡以内的城市:
127.0.0.1:6379> georadiusbymember
cities:locations beijing 150 km
1) "beijing"
2) "tianjin"
3) "tangshan"
4) "baoding"
5.?擷取geohash
geohash key member [member ...]
redis使用geohash将二維經緯度轉換為一維字元串,下面操作會傳回beijing的geohash值。
127.0.0.1:6379> geohash cities:locations
beijing
1) "wx4ww02w070"
geohash有如下特點:
geo的資料類型為zset,redis将所有地理位置資訊的geohash存放在zset中。
127.0.0.1:6379> type cities:locations
zset
字元串越長,表示的位置更精确,表3-8給出了字元串長度對應的精度,例如geohash長度為9時,精度在2米左右。
兩個字元串越相似,它們之間的距離越近,redis利用字元串字首比對算法實作相關的指令。
geohash編碼和經緯度是可以互相轉換的。
redis正是使用有序集合并結合geohash的特性實作了geo的若幹指令。
6.?删除地理位置資訊
zrem key member
geo沒有提供删除成員的指令,但是因為geo的底層實作是zset,是以可以借用zrem指令實作對地理位置資訊的删除。