真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何分析Redis中的GeoHash

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

我們提供的服務(wù)有:網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、射陽ssl等。為超過千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的射陽網(wǎng)站制作公司

如何分析Redis中的GeoHash

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

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

我們打開地圖發(fā)現(xiàn)地圖并不是一開始把所有的細(xì)節(jié)都顯示,比如我首先看到的是中國,然后放大看到的是廣東,再放大看到的是深圳,那么我們假設(shè)這個是一個大盒子,里面有很多個小盒子,小盒子里面有很多更小的盒子,每個小盒子都用二進(jìn)制標(biāo)記比如小盒子里: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ìn)制

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

第三步:按照base32進(jìn)行編碼

Base32編碼表的其中一種如下,是用0-9、b-z(去掉a, i, l, o)這32個字母進(jìn)行編碼。具體操作是先將上一步得到的合并后二進(jìn)制轉(zhuǎn)換為10進(jìn)制數(shù)據(jù),然后對應(yīng)生成Base32碼。需要注意的是,將5個二進(jìn)制位轉(zhuǎn)換成一個base32碼。在Redis中經(jīng)緯度使用52位的整數(shù)進(jìn)行編碼,最后的結(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}上進(jìn)行直接定位,它是 GeoHash的標(biāo)準(zhǔn)編碼值。

> geohash name zhangsan1) "wmqtd2reke0"

附近的元素

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

#### 獲取據(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ù)坐標(biāo)值來查詢附近的元素的指令georadius,這個指令更加有用,它可以根據(jù)用戶的定位來計算附近的餐館”等。它的參數(shù)和georadiusbyrnernber基本一致,唯一的差別是將目標(biāo)元素改成經(jīng)緯度坐標(biāo)值。

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

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

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


網(wǎng)站名稱:如何分析Redis中的GeoHash
標(biāo)題網(wǎng)址:http://weahome.cn/article/ggegpi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部