Redis GEO 特性在 LBS 中的應用總結

什麼是LBS

LBS(Location Based Service),基於位置的服務。mysql

Redis和GEO

Redis 是最熱門的 nosql 數據庫之一,它的最大特色就是快。
因此在 LBS 這種須要大量寫入和查詢的應用場景中,用它來存儲用戶的地理位置信息最適合不過了。git

Redis 的 GEO 是 3.2 版本的新特性。這個功能能夠將用戶給定的地理位置信息儲存起來, 並對這些信息進行操做。redis

PS:關於三種nosql數據庫這裏我也作了調研,其中mongodb最大的特色是靈活,由於其數據是以json的格式存儲,因此字段隨時能夠增長或減小;Redis的特色是快,適合單一的,簡單的,大量數據的存儲;HBase我沒有作深刻研究,它的特色是大,適合作離線緩存。在處理社交這種關係複雜的數據存儲時,依然仍是須要用mysql這種關係型數據庫,nosql並不能徹底替代。sql

使用

目前 redis 支持如下 6 個 GEO 的相關操做mongodb

  • geoadd:增長某個地理位置的座標。
  • geopos:獲取某個地理位置的座標。
  • geodist:獲取兩個地理位置的距離。
  • georadius:根據給定地理位置座標獲取指定範圍內的地理位置集合。
  • georadiusbymember:根據給定地理位置獲取指定範圍內的地理位置集合。
  • geohash:獲取某個地理位置的geohash值。

添加位置和獲取位置

GEOADD location-set longitude latitude member [longitude latitude member ...]數據庫

示例json

redis> GEOADD Hangzhou 120.0919500000 30.3219600000 Xihu緩存

獲取某個地理位置的座標

GEOPOS key member [member ...]nosql

示例code

redis> GEOPOS Hangzhou Sandun Xixi Xihu

獲取兩個地理位置的距離

GEODIST location-set location-x location-y [unit]

其中 unit 參數是距離單位,可選填

  • m 表示單位爲米。
  • km 表示單位爲公里。
  • mi 表示單位爲英里。
  • ft 表示單位爲英尺。

示例

redis> GEODIST Hangzhou Xihu Xixi m

根據給定地理位置座標獲取指定範圍內的地理位置集合

這個功能頗有用,能夠用來查找周邊的點

GEORADIUS location-set longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]

其中:

radius表示範圍距離,距離單位是 m|km|ft|mi

可選參數:

  • WITHCOORD:傳入WITHCOORD參數,則返回結果會帶上匹配位置的經緯度。
  • WITHDIST:傳入WITHDIST參數,則返回結果會帶上匹配位置與給定地理位置的距離。
  • ASC|DESC:默認結果是未排序的,傳入ASC爲從近到遠排序,傳入DESC爲從遠到近排序。
  • WITHHASH:傳入WITHHASH參數,則返回結果會帶上匹配位置的hash值。
  • COUNT count:傳入COUNT參數,能夠返回指定數量的結果。

示例

redis> GEORADIUS Hangzhou 120.0919500000 30.3219600000 10 km

根據給定地理位置獲取指定範圍內的地理位置集合

GEORADIUSBYMEMBER key member radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]

和 GEORADIUS 同樣,只是傳入的是member名,不是座標了

redis> GEORADIUS Hangzhou Xihu 10 km

相關文章
相關標籤/搜索