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