系列文章html
移動互聯網時代LBS應用愈來愈多,交友軟件中附近的小姐姐、外賣軟件中附近的美食店鋪、打車軟件附近的車輛等等,那這種附近各類形形色色的XX是如何實現的呢,git
我麼你都知道地球上的地理位置是使用二維的經緯度表示,經度範圍 (-180, 180],緯度範圍 (-90, 90],只要咱們肯定一個點的經緯度就能夠名曲他在地球的位置redis
例如打車,最直觀的操做就是實時記錄更新各個車的位置,而後去咱們要找車時,在數據庫中查找距離咱們(座標x0,y0)附近r千米的車輛,使用以下SQL便可:數據庫
select cart from position where x0-r < x < x0+r and y0-r < y < y0+r
複製代碼
可是這樣會有什麼問題呢?c#
今天咱們講的是使用Redis來解決附近的問題。bash
Redis在3.2版本之後增長了地理位置的處理,其提供了6個地理位置相關的命令微信
geo add key longitude latitude member [longitude latitude member ...]
如添加杭州北京上海的地理位置
127.0.0.1:6379> geoadd city 120.20000 30.26667 hangzhou 116.41667 39.91667 beijing 121.47 31.23 shanghai
複製代碼
geopos 指令能夠獲取集合中任意元素的經緯度座標,能夠一次獲取多個。併發
127.0.0.1:6379> geopos city hangzhou beijing shanghai
1) 1) "120.15000075101852417"
2) "30.2800007575645509"
2) 1) "116.39999896287918091"
2) "39.90000009167092543"
3) 1) "121.47000163793563843"
2) "31.22999903975783553"
127.0.0.1:6379> geopos city hangzhou
1) 1) "120.15000075101852417"
2) "30.2800007575645509"
複製代碼
距離單位能夠是 m、km、ml、ft,分別表明米、公里、英里和尺。異步
127.0.0.1:6379> geodist city shanghai hangzhou km
"164.5694"
127.0.0.1:6379> geodist city beijing hangzhou km
"1122.7998"
複製代碼
使用GEORADIUSBYMEMBER
命令便可查詢附近的位置分佈式
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
例如查找距離杭州300km之內的城市的10個城市按距離排序
127.0.0.1:6379> GEORADIUSBYMEMBER city hangzhou 300 km WITHCOORD WITHDIST WITHHASH ASC COUNT 10
1) 1) "hangzhou"
2) "0.0000"
3) (integer) 4054134257390783
4) 1) "120.15000075101852417"
2) "30.2800007575645509"
2) 1) "shanghai"
2) "164.5694"
3) (integer) 4054803462927619
4) 1) "121.47000163793563843"
2) "31.22999903975783553"
複製代碼
在給定如下可選項時, 命令會返回額外的信息:
可能你還注意到有一個命令GEOHASH
,那他是作什麼的呢
127.0.0.1:6379> geohash city hangzhou
1) "wtmkq069cc0"
127.0.0.1:6379> geohash city beijing
1) "wx4fbxxfke0"
複製代碼
返回的實際上是元素的經緯度通過goehash計算後的base32編碼字符串。能夠經過鏈接 geohash.org/${hash}中進行直… geohash 的標準編碼值。
其存儲結構主要使用的是Redis的有序結構,其score是GeoHash的52位整數值
127.0.0.1:6379> ZRANGE city 0 -1 WITHSCORES
1) "hangzhou"
2) "4054134257390783"
3) "shanghai"
4) "4054803462927619"
5) "beijing"
6) "4069885360207904"
複製代碼
其原理比較容易理解,核心思想就是將球體轉換爲球面,區塊轉換爲一點
主要分爲三步
詳細原理解析能夠參考這邊文章GeoHash核心原理解析
目前不少數據存儲引擎都支持Geo的處理,如MongoDB、MySql、PgSql、Elasticsearch等。感興趣的讀者能夠去研究一下。
本文亦在微信公衆號【小道資訊】發佈,歡迎掃碼關注!