Redis開發與運維 3 8 GEO

2021-09-23 16:29:32 字數 3308 閱讀 1141

3.8 geo

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:

127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijing

(integer) 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 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]

[withhash] [count count] [asc|desc] [store key] [storedist key]

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命令實現對地理位置資訊的刪除。

redis 開發與運維 1

由於手上負責的專案很依賴redis,而且redis曾經出過問題,故決定好好系統學習一下redis的知識,本文打算先介紹一下redis的基礎知識 首先我們必須明確的幾個知識點1 1 keys 這個命令可以檢視所有的鍵,這是這個 當前db所有的key 127.0 0.1 6379 keys 1 haha...

《Redis開發與運維》筆記 初識Redis

目錄 redis優點 redis特性 速度快基於鍵值對的資料結構伺服器 豐富的功能 簡單穩定 客戶端語言多 持久化主從複製 高可用和分布式 redis使用場景 redis可以做什麼 redis不可以做什麼 用好redis的建議 切勿當作黑盒使用,開發與運維同樣重要 閱讀原始碼 redis重大版本 r...

《Redis開發與運維》 列表List

list 有序,可重複 redis中列表 list 型別是用來儲存多個有序的字串,列表中的每個字串成為元素 element 乙個列表最多可以儲存2 32 1個元素。命令 新增操作 rpush key value value 從右向左插入元素 lpush key value value 從左向右插入元...