Redis GEO 地理位置



Redis 3.2版本新增GEO(地理位置)。

GEO指令

GEOADD

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

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

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

時間復雜度:O(log(N))

GEODIST

命令:GEODIST key member1 member2 [unit]

命令描述:

返回兩個給定位置之間的距離。如果兩個位置之間的其中一個不存在, 那么命令返回空值。指定單位的參數 unit 必須是以下單位的其中一個:

  • m 米
  • km 千米
  • mi 英里
  • ft 英尺

時間復雜度:O(log(N))

GEOPOP

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

命令描述:從key里返回所有給定位置元素的位置(經度和緯度)。

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

時間復雜度:O(log(N))

GEOHASH

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

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

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

時間復雜度:O(log(N))

GEORADIUS

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

命令描述:

以給定的經緯度為中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。可以指定WITHDIST返回距離,WITHCOORD返回經緯度,WITHHASH返回geohash值。可以指定ASC或DESC,根據距離來排序。可以指定COUNT限定返回的記錄數。

時間復雜度:O(N+log(M)),N為指定半徑范圍內的元素個數,M為要返回的個數。

GEORADIUSBYMEMBER

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

命令描述:這個命令和 GEORADIUS 命令一樣, 都可以找出位於指定范圍內的元素, 但是 GEORADIUSBYMEMBER 的中心點是由給定的位置元素決定的。可以指定WITHDIST返回距離,WITHCOORD返回經緯度,WITHHASH返回geohash值。可以指定ASC或DESC,根據距離來排序。可以指定COUNT限定返回的記錄數。

時間復雜度:O(log(N)+M),N為指定半徑范圍內的元素個數,M為要返回的個數。

指令補充

刪除操作

Redis GEO 只有增查操作,沒有刪除指令,因為是使用zset保存對象,可以使用zrem刪除。

避免單集合數量過多

通過設置多個key避免單集合數量過多。

存儲原理

GEOADD存儲原理

內部使用有序集合zset存儲,元素的score值是經緯度對應的52位geohash值,geohash以base32的方式編碼。

  1. 參數提取和校驗。
  2. 將經緯度轉換為52位的geohash值作為score。
  3. 調用zadd指令存入member和score。

GEOHASH精度問題

 Latitude的范圍是:-90 到 +90
 Longitude的范圍:-180 到 +180
 地球參考球體的周長:40075016.68米


免責聲明!

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



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