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的方式編碼。
- 參數提取和校驗。
- 將經緯度轉換為52位的geohash值作為score。
- 調用zadd指令存入member和score。
GEOHASH精度問題
Latitude的范圍是:-90 到 +90
Longitude的范圍:-180 到 +180
地球參考球體的周長:40075016.68米