久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Redis中的GEO地理位置模塊怎么用

136次閱讀
沒有評論

共計 3593 個字符,預計需要花費 9 分鐘才能閱讀完成。

這篇文章主要介紹了 Redis 中的 GEO 地理位置模塊怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。

GEO 是 Redis 在 3.2 版本之后新增的地理位置模塊,意味可以用 Redis 來實現附近的地點功能。【相關推薦:Redis 視頻教程】

用數據庫計算

一般的方法都是通過矩形區域來限定元素的數量,然后對區域內的元素進行全量距離計算再排序。這樣可以明顯減少計算量。

select id from positions where x0-r   x   x0+r and y0-r   y   y0+r

以上 SQL 為了增加性能,需要在經緯度坐標加上雙向復合索引。
但是數據庫查詢性能畢竟有限,如果在高并發場合,這可能并不是一個很好的方案。

GEO 算法

業界比較通用的地理位置距離排序算法是 GeoHash 算法,Redis 也使用 GeoHash 算法。

GeoHash 算法將 二維的經緯度數據映射到一維的整數,這樣所有的元素都將在掛載到一條線上,距離靠近的二維坐標映射到一維后的點之間距離也會很接近。當我們想要計算「附近的人時」,首先將目標位置映射到這條線上,然后在這個一維的線上獲取附近的點就行了。

算法實現,它將整個地球看成一個 二維平面,然后劃分成了一系列正方形的方格,就好比圍棋棋盤。所有的地圖元素坐標都將放置于唯一的方格中。方格越小,坐標越精確。然后對這些方格進行整數編碼,越是靠近的方格編碼越是接近。

編碼之后,每個地圖元素的坐標都將變成一個整數,通過這個整數可以還原出元素的坐標,整數越長,還原出來的坐標值的損失程度就越小。

GeoHash 算法會繼續對這個整數做一次 base32 編碼 (0-9,a-z 去掉 a,i,l,o 四個字母) 變成一個字符串。

在 Redis 里面,經緯度使用 52 位的整數進行編碼,放進了 zset 里面,zset 的 value 是元素的 key,score 是 GeoHash 的 52 位整數值。

在使用 Redis 進行 Geo 查詢時,我們要時刻想到它的內部結構實際上只是一個 zset(skiplist)。通過 zset 的 score 排序就可以得到坐標附近的其它元素 (實際情況要復雜一些,不過這樣理解足夠了),通過將 score 還原成坐標值就可以得到元素的原始坐標。

Redis GEO 指令

1. 增加 geoadd

geoadd key longitude latitude member [longitude latitude member ...]
127.0.0.1:6379  geoadd beijing 116.403856 39.924043 gugong
(integer) 1
127.0.0.1:6379  geoadd beijing 116.343620 39.947633 dongwuyuan
(integer) 1
127.0.0.1:6379  geoadd beijing 116.328643 39.900272 xizhan 116.415324 39.931231 meishuguan 116.416852 39.887607 tiantan
(integer) 3

刪除用 zset 的 zrem 即可

2. 距離 geodist

geodist key member1 member2 [unit]
127.0.0.1:6379  geodist beijing gugong xizhan km
 6.9402 
127.0.0.1:6379  geodist beijing gugong dongwuyuan #  默認單位 m
 5768.5737 
127.0.0.1:6379  geodist beijing xizhan xizhan
 0.0000

距離單位可以是 m、km、ml、ft,分別代表米、千米、英里和尺。

3. 位置 geopos

geopos key member [member ...]
127.0.0.1:6379  geopos beijing gugong
1) 1)  116.4038559794426 
 2)  39.92404192186725 
127.0.0.1:6379  geopos beijing tiantan xizhan
1) 1)  116.41685396432877 
 2)  39.887607839922914 
2) 1)  116.32864147424698 
 2)  39.900271306834973

4. hash 值 geohash

geohash key member [member ...]
127.0.0.1:6379  geohash beijing gugong
1)  wx4g0gfwqk0

經緯度字符串編碼是 base32 編碼,可以通過 http://geohash.org/wx4g0gfwqk0 直接查找經緯度

5. 附近地點 georadiusbymember

1、查詢 ireader 范圍 20 公里以內最多 3 個元素按距離正排,它不會排除自身(倒排使用用 desc)

127.0.0.1:6379  georadiusbymember company ireader 20 km count 3 asc
1)  ireader 
2)  juejin 
3)  meituan

2、三個可選參數 withcoord withdist withhash 用來攜帶附加參數, withdist 很有用,它可以用來顯示距離

georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES]
127.0.0.1:6379  georadiusbymember beijing gugong 5 km withcoord withdist withhash count 3 asc
1) 1)  gugong 
 2)  0.0000 
 3) (integer) 4069885568932443
 4) 1)  116.4038559794426 
 2)  39.92404192186725 
2) 1)  meishuguan 
 2)  1.2634 
 3) (integer) 4069885710390435
 4) 1)  116.41532510519028 
 2)  39.93123039107514 
3) 1)  tiantan 
 2)  4.2014 
 3) (integer) 4069885398502557
 4) 1)  116.41685396432877 
 2)  39.887607839922914

3、根據坐標值來查詢附近的元素

 georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES]
127.0.0.1:6379  georadius beijing 116.383882 39.922061 5 km withcoord withdist withhash count 3 asc
1) 1)  gugong 
 2)  1.7180 
 3) (integer) 4069885568932443
 4) 1)  116.4038559794426 
 2)  39.92404192186725 
2) 1)  meishuguan 
 2)  2.8693 
 3) (integer) 4069885710390435
 4) 1)  116.41532510519028 
 2)  39.93123039107514 
3) 1)  dongwuyuan 
 2)  4.4588 
 3) (integer) 4069879836419688
 4) 1)  116.34361892938614 
 2)  39.94763257169722

注意事項

實際應用中數據可能會有百萬千萬條,我們知道 Redis Geo 將全部放在一個 zset 集合中。在 Redis 的集群環境中,集合可能會從一個節點遷移到另一個節點,如果單個 key 的數據過大,會對集群的遷移工作造成較大的影響,在集群環境中單個 key 對應的數據量不宜超過 1M,否則會導致集群遷移出現卡頓現象,影響線上服務的正常運行。

所以,這里建議 Geo 的數據使用單獨的 Redis 實例部署,不使用集群環境。

如果數據量過億甚至更大,就需要對 Geo 數據進行拆分,按國家拆分、按省拆分,按市拆分,在人口特大城市甚至可以按區拆分。這樣就可以顯著降低單個 zset 集合的大小。

感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“Redis 中的 GEO 地理位置模塊怎么用”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-15發表,共計3593字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 榆社县| 衡阳市| 应用必备| 老河口市| 罗田县| 额尔古纳市| 安乡县| 贡觉县| 望奎县| 福州市| 黑水县| 仁怀市| 长乐市| 舟曲县| 南和县| 兖州市| 三原县| 保山市| 乌拉特中旗| 大渡口区| 崇信县| 乌鲁木齐县| 井陉县| 循化| 潼关县| 保靖县| 纳雍县| 上犹县| 德钦县| 绍兴市| 平顶山市| 任丘市| 交城县| 营山县| 阳朔县| 松潘县| 会昌县| 镇江市| 平塘县| 绥芬河市| 高陵县|