Redis GEO使用
????? Redis 3.2 版本提供了GEO(地理信息定位)功能,支持存儲地理位置及計算地理位置間的距離。美團最近騎手/附近搖一搖/滴滴最近司機等同質功能都可以使用該功能實現。
一、GEO基礎知識
2.1 什么是經緯度
經緯度是經度與緯度的合稱組成一個坐標系統,稱為地理坐標系統,它是一種利用三度空間的球面來定義地球上的空間的球面坐標系統,能夠標示地球上的任何一個位置。
東經正數,西經為負數。經度是地球上一個地點離一根被稱為本初子午線的南北方向走線以東或以西的度數。本初子午線的經度是0°,地球上其它地點的經度是向東到180°或向西到180°。
北緯為正數,南緯為負數。緯度 是指過橢球面上某點作法線,該點法線與赤道平面的線面角,其數值在0至90度之間。位于赤道以北的點的緯度叫北緯,記為N;位于赤道以南的點的緯度稱南緯,記為S。
2.2 Geohash算法原理及實現
Geohash算法原理及實現二、Redis GEO 相關命令
Geoadd
geoadd 用于存儲指定的地理空間位置,可以將一個或多個經度(longitude)、緯度(latitude)、位置名稱(member)添加到指定的 key 中。
geoadd 語法格式如下:
GEOADD key longitude latitude member [longitude latitude member ...]?geopos
geopos 用于從給定的 key 里返回所有指定名稱(member)的位置(經度和緯度),不存在的返回 nil。?
geodist
geodist 用于返回兩個給定位置之間的距離。
geodist 語法格式如下:
GEODIST key member1 member2 [m|km|ft|mi]georadius、georadiusbymember
georadius 以給定的經緯度為中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。
georadiusbymember 和 GEORADIUS 命令一樣, 都可以找出位于指定范圍內的元素, 但是 georadiusbymember 的中心點是由給定的位置元素決定的, 而不是使用經度和緯度來決定中心點。
georadius 與 georadiusbymember 語法格式如下:
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]參數說明:
- m :米,默認單位。
- km :千米。
- mi :英里。
- ft :英尺。
- WITHDIST: 在返回位置元素的同時, 將位置元素與中心之間的距離也一并返回。
- WITHCOORD: 將位置元素的經度和緯度也一并返回。
- WITHHASH: 以 52 位有符號整數的形式, 返回位置元素經過原始 geohash 編碼的有序集合分值。 這個選項主要用于底層應用或者調試, 實際中的作用并不大。
- COUNT 限定返回的記錄數。
- ASC: 查找結果根據距離從近到遠排序。
- DESC: 查找結果根據從遠到近排序。
geohash
Redis GEO 使用 geohash 來保存地理位置的坐標。
geohash 用于獲取一個或多個位置元素的 geohash 值。
geohash 語法格式如下:
GEOHASH key member [member ...]參考:Redis GEO
三、Redis源碼剖析之GEO——Redis是如何高效檢索地理位置
Redis 到底是怎么實現“附近的人”這個功能的呢? - 云+社區 - 騰訊云https://cloud.tencent.com/developer/article/1526950
源碼:
Redis GEO 源碼注釋 — blog.huangz.mehttps://blog.huangz.me/diary/2015/annotated-redis-geo-source.html
拋開眾多可選參數不談,簡單總結下GEORADIUS命令是怎么利用geohash獲取目標位置對象的:
1、參數提取和校驗;
2、利用中心點和輸入半徑計算待查區域范圍。這個范圍參數包括滿足條件的最高的geohash網格等級(精度) 以及 對應的能夠覆蓋目標區域的九宮格位置;(后續會有詳細說明)
3、對九宮格進行遍歷,根據每個geohash網格的范圍框選出位置對象。進一步找出與中心點距離小于輸入半徑的對象,進行返回。
四、Q&A
1.什么時候可以使用redis的geo功能?
做附近的人,按照距離排序等與距離相關功能時。
2.redis geo如何提高自己的檢索速度
1)利用中心點和輸入半徑計算待查區域范圍,只對附近九塊待查區域范圍內的點進行距離計算
2)利用中心點和輸入半徑計算待查區域范圍時,使用跳表的數據結構,檢索速度比肩二叉搜索樹
總結
以上是生活随笔為你收集整理的Redis GEO使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ppt如何旋转流程图_画流程图 | 你还
- 下一篇: 自学js第十五天:event坐标偏移量位