天天看點

Redis開發與運維. 3.8 GEO

<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&gt; 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&gt; 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&gt; 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&gt; 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&gt; geohash cities:locations

beijing

1) "wx4ww02w070"

geohash有如下特點:

geo的資料類型為zset,redis将所有地理位置資訊的geohash存放在zset中。

127.0.0.1:6379&gt; type cities:locations

zset

字元串越長,表示的位置更精确,表3-8給出了字元串長度對應的精度,例如geohash長度為9時,精度在2米左右。

兩個字元串越相似,它們之間的距離越近,redis利用字元串字首比對算法實作相關的指令。

geohash編碼和經緯度是可以互相轉換的。

redis正是使用有序集合并結合geohash的特性實作了geo的若幹指令。

6.?删除地理位置資訊

zrem key member

geo沒有提供删除成員的指令,但是因為geo的底層實作是zset,是以可以借用zrem指令實作對地理位置資訊的删除。

繼續閱讀