Redis GEO地理位置信息,查看附近的人


在之前的一篇文章《SpringBoot入門教程(五)Java基於MySQL實現附近的人》,我們介紹了Java基於MySQL實現查找附近的人的功能。今天就來研究研究"查找附近的人"的另一個方案,一個基於Redis的方案。

vGEO地理位置

可用版本: >= 3.2.0

地理位置大概提供了6個命令,分別為:

  • GEOADD
  • GEODIST
  • GEOHASH
  • GEOPOS
  • GEORADIUS
  • GEORADIUSBYMEMBER

vGEOADD

1.1 GEOADD概念

將給定的空間元素(緯度、經度、名字)添加到指定的鍵里面。 這些數據會以有序集合的形式被儲存在鍵里面, 從而使得像 GEORADIUS GEORADIUSBYMEMBER 這樣的命令可以在之后通過位置查詢取得這些元素。

GEOADD 命令以標准的 x,y 格式接受參數, 所以用戶必須先輸入經度, 然后再輸入緯度。 GEOADD 能夠記錄的坐標是有限的: 非常接近兩極的區域是無法被索引的。 精確的坐標限制由 EPSG:900913 / EPSG:3785 / OSGEO:41001 等坐標系統定義, 具體如下:

有效的經度介於 -180 度至 180 度之間。
有效的緯度介於 -85.05112878 度至 85.05112878 度之間。

當用戶嘗試輸入一個超出范圍的經度或者緯度時, GEOADD 命令將返回一個錯誤。

1.2 GEOADD命令

時間復雜度: 每添加一個元素的復雜度為 O(log(N)) , 其中 N 為鍵里面包含的位置元素數量。

命令demo: GEOADD key longitude latitude member [longitude latitude member ...]

命令描述:將指定的地理空間位置(緯度、經度、名稱)添加到指定的key中。

返回值:添加到sorted set元素的數目,但不包括已更新score的元素。

1.3 GEOADD示例

Redis GEO地理位置信息,查看附近的人

vGEODIST

2.1 GEODIST概念

返回兩個給定位置之間的距離。

如果兩個位置之間的其中一個不存在, 那么命令返回空值。

指定單位的參數 unit 必須是以下單位的其中一個:

  • m 表示單位為米。
  • km 表示單位為千米。
  • mi 表示單位為英里。
  • ft 表示單位為英尺。

如果用戶沒有顯式地指定單位參數, 那么 GEODIST 默認使用米作為單位。

GEODIST 命令在計算距離時會假設地球為完美的球形, 在極限情況下, 這一假設最大會造成 0.5% 的誤差。

2.2 GEODIST命令

復雜度: O(log(N))

命令demo: GEODIST key member1 member2 [unit]

2.3 GEODIST示例

Redis GEO地理位置信息,查看附近的人

vGEOPOS

3.1 GEOPOS概念

從鍵里面返回所有給定位置元素的位置(經度和緯度)。

因為 GEOPOS 命令接受可變數量的位置元素作為輸入, 所以即使用戶只給定了一個位置元素, 命令也會返回數組回復。

GEOPOS 命令返回一個數組, 數組中的每個項都由兩個元素組成: 第一個元素為給定位置元素的經度, 而第二個元素則為給定位置元素的緯度。 當給定的位置元素不存在時, 對應的數組項為空值。

3.2 GEOPOS命令

時間復雜度: 獲取每個位置元素的復雜度為 O(log(N)) , 其中 N 為鍵里面包含的位置元素數量。

命令demo: GEOPOS key member [member ...]

3.2 GEOPOS示例

Redis GEO地理位置信息,查看附近的人

vGEOHASH

4.1 GEOHASH概念

返回一個或多個位置元素的 Geohash 表示。

返回值:一個數組, 數組的每個項都是一個 geohash 。 命令返回的 geohash 的位置與用戶給定的位置元素的位置一一對應。

4.2 GEOHASH命令

時間復雜度: 尋找每個位置元素的復雜度為 O(log(N)) , 其中 N 為給定鍵包含的位置元素數量。

命令demo: GEOHASH key member [member ...]

命令描述:返回一個或多個位置元素的 Geohash 表示。通常使用表示位置的元素使用不同的技術,使用Geohash位置52點整數編碼。由於編碼和解碼過程中所使用的初始最小和最大坐標不同,編碼的編碼也不同於標准。此命令返回一個標准的Geohash

4.3 GEOHASH示例

Redis GEO地理位置信息,查看附近的人

vGEORADIUS

5.1 GEORADIUS概念

以給定的經緯度為中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。

范圍可以使用以下其中一個單位:

  • m 表示單位為米。
  • km 表示單位為千米。
  • mi 表示單位為英里。
  • ft 表示單位為英尺。

在給定以下可選項時, 命令會返回額外的信息:

WITHDIST : 在返回位置元素的同時, 將位置元素與中心之間的距離也一並返回。 距離的單位和用戶給定的范圍單位保持一致。

WITHCOORD : 將位置元素的經度和維度也一並返回。

WITHHASH : 以 52 位有符號整數的形式, 返回位置元素經過原始 geohash 編碼的有序集合分值。 這個選項主要用於底層應用或者調試, 實際中的作用並不大。

命令默認返回未排序的位置元素。 通過以下兩個參數, 用戶可以指定被返回位置元素的排序方式:

ASC : 根據中心的位置, 按照從近到遠的方式返回位置元素。

DESC : 根據中心的位置, 按照從遠到近的方式返回位置元素。

在默認情況下, GEORADIUS 命令會返回所有匹配的位置元素。 雖然用戶可以使用 COUNT 選項去獲取前 N 個匹配元素, 但是因為命令在內部可能會需要對所有被匹配的元素進行處理, 所以在對一個非常大的區域進行搜索時, 即使只使用 COUNT 選項去獲取少量元素, 命令的執行速度也可能會非常慢。 但是從另一方面來說, 使用 COUNT 選項去減少需要返回的元素數量, 對於減少帶寬來說仍然是非常有用的。

GEORADIUS 命令返回一個數組, 具體來說:

  • 在沒有給定任何 WITH 選項的情況下, 命令只會返回一個像 ["New York","Milan","Paris"] 這樣的線性(linear)列表。
  • 在指定了 WITHCOORD 、 WITHDIST 、 WITHHASH 等選項的情況下, 命令返回一個二層嵌套數組, 內層的每個子數組就表示一個元素。

在返回嵌套數組時, 子數組的第一個元素總是位置元素的名字。 至於額外的信息, 則會作為子數組的后續元素, 按照以下順序被返回:

  • 以浮點數格式返回的中心與位置元素之間的距離, 單位與用戶指定范圍時的單位一致。
  • geohash 整數。
  • 由兩個元素組成的坐標,分別為經度和緯度。

5.2 GEORADIUS命令

時間復雜度: O(N+log(M)), 其中 N 為指定半徑范圍內的位置元素數量, 而 M 則是被返回位置元素的數量。

命令demo: GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

5.3 GEORADIUS示例

Redis GEO地理位置信息,查看附近的人

Redis GEO地理位置信息,查看附近的人

vGEORADIUSBYMEMBER

6.1 GEORADIUSBYMEMBER概念

這個命令和 GEORADIUS 命令一樣, 都可以找出位於指定范圍內的元素, 但是 GEORADIUSBYMEMBER 的中心點是由給定的位置元素決定的, 而不是像 GEORADIUS 那樣, 使用輸入的經度和緯度來決定中心點。

時間復雜度: O(log(N)+M), 其中 N 為指定范圍之內的元素數量, 而 M 則是被返回的元素數量。

6.2 GEORADIUSBYMEMBER命令

命令: GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

6.3 GEORADIUSBYMEMBER示例

Redis GEO地理位置信息,查看附近的人

vSpingboot中使用方法

        RedisTemplate redisTemplate;
        redisTemplate.opsForGeo().geoAdd()
        redisTemplate.opsForGeo().geoDist()
        redisTemplate.opsForGeo().geoHash()
        redisTemplate.opsForGeo().geoPos()
        redisTemplate.opsForGeo().geoRadius()
        redisTemplate.opsForGeo().geoRadiusByMember()

v源碼地址

https://github.com/toutouge/javademo/tree/master/hellospringboot


作  者:請叫我頭頭哥
出  處:http://www.cnblogs.com/toutou/
關於作者:專注於基礎平台的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回復。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM