溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何分析Redis中的GeoHash

發(fā)布時間:2021-12-09 17:13:06 來源:億速云 閱讀:130 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關如何分析Redis中的GeoHash,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

如何分析Redis中的GeoHash

在生活中我們有時候需要點外賣、騎共享單車等等,我們打開軟件找到附近餐廳、離我最近的單車,那么他們是怎么快速定位到的呢?我們把地圖看作一個二維平面,我們在某個點上然后找到附近10km內(nèi)的所有餐廳,這時候我們知道求兩點直接的距離是需要一個公式,且需要知道兩點的x,y軸坐標才能計算出距離,通過計算出距離然后進行排列,那么我們就能過找到離我最近的一個餐廳了。

那么這里我們考慮幾個問題,我每次搜索的時候需要計算我離餐廳的距離,那么我們能不能把這個距離保存起來呢?如果我保存了,我下次在另一個地方那是不是還得重新計算?所以在數(shù)量級小的時候可以考慮這個做法,但是數(shù)量級起來了這個方法不是一個好的方法。

我們打開地圖發(fā)現(xiàn)地圖并不是一開始把所有的細節(jié)都顯示,比如我首先看到的是中國,然后放大看到的是廣東,再放大看到的是深圳,那么我們假設這個是一個大盒子,里面有很多個小盒子,小盒子里面有很多更小的盒子,每個小盒子都用二進制標記比如小盒子里:00,01,10,11....

如何分析Redis中的GeoHash如何分析Redis中的GeoHash如何分析Redis中的GeoHash

我們通過把(x,y)轉(zhuǎn)換成的編碼連接起來,如上圖所示,是不是就可以把他們轉(zhuǎn)換成一個一維的線性結(jié)構(gòu),那么對于我們的排序非常有利。那么這個就是我們今天所說的GeoHash。

GeoHash算法分為三步

第一步:把經(jīng)緯度轉(zhuǎn)換成二進制

第二步:把二進制的經(jīng)緯度合并

第三步:按照base32進行編碼

Base32編碼表的其中一種如下,是用0-9、b-z(去掉a, i, l, o)這32個字母進行編碼。具體操作是先將上一步得到的合并后二進制轉(zhuǎn)換為10進制數(shù)據(jù),然后對應生成Base32碼。需要注意的是,將5個二進制位轉(zhuǎn)換成一個base32碼。在Redis中經(jīng)緯度使用52位的整數(shù)進行編碼,最后的結(jié)果放在zset里面,ZSet的value是元素的key,score是GeoHash的52位數(shù)值,這里注意score是一個浮點型,但是對于52位的整形是無損存儲。Redis給我們提供6個Geo命令,下面我們就開始使用這個Geo命令了

查詢
這里我們注意添加是geoadd,可以添加多個點,刪除就是直接使用zrem即可  
> geoadd name 110.50000 30.50000 zhangsan(integer) 1> geoadd name 110.60000 30.60000 lisi(integer) 1> geoadd name 120.50000 30.60000 wangwu(integer) 1> geoadd name 111.45000 29.90000 zhaoliu 111.50000 30.10000 mango(integer) 2
距離

geodist 指令可以用來計算兩個元素之間的距離,攜帶集合名稱、兩個名稱和距離單位,距離單位可以是 m、 km、ml 和丘,分別代表米、干米、英里和尺。

> geodist name zhangsan mango km"105.8372"
獲取元素位置  

geopos 指令可以獲取

> geopos name zhangsan1) 1) "110.49999743700027"   2) "30.499999345868211"
獲取元素hash值

GeoHash 可以獲取元素的經(jīng)緯度編碼字符串,上面已經(jīng)提到,它是 base32 編碼。你可以使用這個編碼值去http://geohash.org/$ {hash}上進行直接定位,它是 GeoHash的標準編碼值。

> geohash name zhangsan1) "wmqtd2reke0"

附近的元素

georadiusbymember指令是最為關鍵的指令之一,它可以用來查詢指定元素附近的其他元素,它的參數(shù)非常復雜 。

#### 獲取據(jù)離zhangsan20km最近的三個人> georadiusbymember name zhangsan 20 km count 3 asc1) "zhangsan"2) "lisi"#### withcoord withdist withhash三個可選參數(shù)> georadiusbymember name zhangsan 20 km withcoord withdist withhash count 31) 1) "zhangsan"   2) "0.0000"   3) (integer) 4028187045502241   4) 1) "110.49999743700027"      2) "30.499999345868211"2) 1) "lisi"   2) "14.6789"   3) (integer) 4028372360456825   4) 1) "110.60000091791153"      2) "30.599999165046462"

除了georadiusbyrnember指令根據(jù)元素查詢附近的元素,Redis還提供了根據(jù)坐標值來查詢附近的元素的指令georadius,這個指令更加有用,它可以根據(jù)用戶的定位來計算附近的餐館”等。它的參數(shù)和georadiusbyrnernber基本一致,唯一的差別是將目標元素改成經(jīng)緯度坐標值。

> georadius name 110.50000 30.50000 20 km count 31) "zhangsan"2) "lisi"

注意:這里的GeoHash雖然好用,它實際上還是個ZSet,數(shù)據(jù)量超過一定的閾值后查詢速度會減慢,那么我們在處理這些問題的時候需要對地圖進行切割或者進行分塊處理。

以上就是如何分析Redis中的GeoHash,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI