redis 附近的人_Redis GEO地理位置信息,查看附近的人
在之前的一篇文章《SpringBoot入門教程(五)Java基于MySQL實現(xiàn)附近的人》,我們介紹了Java基于MySQL實現(xiàn)查找附近的人的功能。今天就來研究研究"查找附近的人"的另一個方案,一個基于Redis的方案。
vGEO地理位置
可用版本: >= 3.2.0
地理位置大概提供了6個命令,分別為:
GEOADD
GEODIST
GEOHASH
GEOPOS
GEORADIUS
GEORADIUSBYMEMBER
vGEOADD
1.1 GEOADD概念
將給定的空間元素(緯度、經(jīng)度、名字)添加到指定的鍵里面。 這些數(shù)據(jù)會以有序集合的形式被儲存在鍵里面, 從而使得像 GEORADIUS 和 GEORADIUSBYMEMBER 這樣的命令可以在之后通過位置查詢?nèi)〉眠@些元素。
GEOADD 命令以標準的 x,y 格式接受參數(shù), 所以用戶必須先輸入經(jīng)度, 然后再輸入緯度。 GEOADD 能夠記錄的坐標是有限的: 非常接近兩極的區(qū)域是無法被索引的。 精確的坐標限制由 EPSG:900913 / EPSG:3785 / OSGEO:41001 等坐標系統(tǒng)定義, 具體如下:
有效的經(jīng)度介于 -180 度至 180 度之間。
有效的緯度介于 -85.05112878 度至 85.05112878 度之間。
當用戶嘗試輸入一個超出范圍的經(jīng)度或者緯度時, GEOADD 命令將返回一個錯誤。
1.2 GEOADD命令
時間復(fù)雜度: 每添加一個元素的復(fù)雜度為 O(log(N)) , 其中 N 為鍵里面包含的位置元素數(shù)量。
命令demo:GEOADD key longitude latitude member [longitude latitude member ...]
命令描述:將指定的地理空間位置(緯度、經(jīng)度、名稱)添加到指定的key中。
返回值:添加到sorted set元素的數(shù)目,但不包括已更新score的元素。
1.3 GEOADD示例
vGEODIST
2.1 GEODIST概念
返回兩個給定位置之間的距離。
如果兩個位置之間的其中一個不存在, 那么命令返回空值。
指定單位的參數(shù) unit 必須是以下單位的其中一個:
m 表示單位為米。
km 表示單位為千米。
mi 表示單位為英里。
ft 表示單位為英尺。
如果用戶沒有顯式地指定單位參數(shù), 那么 GEODIST 默認使用米作為單位。
GEODIST 命令在計算距離時會假設(shè)地球為完美的球形, 在極限情況下, 這一假設(shè)最大會造成 0.5% 的誤差。
2.2 GEODIST命令
復(fù)雜度: O(log(N))
命令demo:GEODIST key member1 member2 [unit]
2.3 GEODIST示例
vGEOPOS
3.1 GEOPOS概念
從鍵里面返回所有給定位置元素的位置(經(jīng)度和緯度)。
因為 GEOPOS 命令接受可變數(shù)量的位置元素作為輸入, 所以即使用戶只給定了一個位置元素, 命令也會返回數(shù)組回復(fù)。
GEOPOS 命令返回一個數(shù)組, 數(shù)組中的每個項都由兩個元素組成: 第一個元素為給定位置元素的經(jīng)度, 而第二個元素則為給定位置元素的緯度。 當給定的位置元素不存在時, 對應(yīng)的數(shù)組項為空值。
3.2 GEOPOS命令
時間復(fù)雜度: 獲取每個位置元素的復(fù)雜度為 O(log(N)) , 其中 N 為鍵里面包含的位置元素數(shù)量。
命令demo:GEOPOS key member [member ...]
3.2 GEOPOS示例
vGEOHASH
4.1 GEOHASH概念
返回一個或多個位置元素的 Geohash 表示。
返回值:一個數(shù)組, 數(shù)組的每個項都是一個 geohash 。 命令返回的 geohash 的位置與用戶給定的位置元素的位置一一對應(yīng)。
4.2 GEOHASH命令
時間復(fù)雜度: 尋找每個位置元素的復(fù)雜度為 O(log(N)) , 其中 N 為給定鍵包含的位置元素數(shù)量。
命令demo:GEOHASH key member [member ...]
命令描述:返回一個或多個位置元素的 Geohash 表示。通常使用表示位置的元素使用不同的技術(shù),使用Geohash位置52點整數(shù)編碼。由于編碼和解碼過程中所使用的初始最小和最大坐標不同,編碼的編碼也不同于標準。此命令返回一個標準的Geohash
4.3 GEOHASH示例
vGEORADIUS
5.1 GEORADIUS概念
以給定的經(jīng)緯度為中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。
范圍可以使用以下其中一個單位:
m 表示單位為米。
km 表示單位為千米。
mi 表示單位為英里。
ft 表示單位為英尺。
在給定以下可選項時, 命令會返回額外的信息:
WITHDIST : 在返回位置元素的同時, 將位置元素與中心之間的距離也一并返回。 距離的單位和用戶給定的范圍單位保持一致。
WITHCOORD : 將位置元素的經(jīng)度和維度也一并返回。
WITHHASH : 以 52 位有符號整數(shù)的形式, 返回位置元素經(jīng)過原始 geohash 編碼的有序集合分值。 這個選項主要用于底層應(yīng)用或者調(diào)試, 實際中的作用并不大。
命令默認返回未排序的位置元素。 通過以下兩個參數(shù), 用戶可以指定被返回位置元素的排序方式:
ASC : 根據(jù)中心的位置, 按照從近到遠的方式返回位置元素。
DESC : 根據(jù)中心的位置, 按照從遠到近的方式返回位置元素。
在默認情況下, GEORADIUS 命令會返回所有匹配的位置元素。 雖然用戶可以使用 COUNT 選項去獲取前 N 個匹配元素, 但是因為命令在內(nèi)部可能會需要對所有被匹配的元素進行處理, 所以在對一個非常大的區(qū)域進行搜索時, 即使只使用 COUNT 選項去獲取少量元素, 命令的執(zhí)行速度也可能會非常慢。 但是從另一方面來說, 使用 COUNT 選項去減少需要返回的元素數(shù)量, 對于減少帶寬來說仍然是非常有用的。
GEORADIUS 命令返回一個數(shù)組, 具體來說:
在沒有給定任何 WITH 選項的情況下, 命令只會返回一個像 ["New York","Milan","Paris"] 這樣的線性(linear)列表。
在指定了 WITHCOORD 、 WITHDIST 、 WITHHASH 等選項的情況下, 命令返回一個二層嵌套數(shù)組, 內(nèi)層的每個子數(shù)組就表示一個元素。
在返回嵌套數(shù)組時, 子數(shù)組的第一個元素總是位置元素的名字。 至于額外的信息, 則會作為子數(shù)組的后續(xù)元素, 按照以下順序被返回:
以浮點數(shù)格式返回的中心與位置元素之間的距離, 單位與用戶指定范圍時的單位一致。
geohash 整數(shù)。
由兩個元素組成的坐標,分別為經(jīng)度和緯度。
5.2 GEORADIUS命令
時間復(fù)雜度: O(N+log(M)), 其中 N 為指定半徑范圍內(nèi)的位置元素數(shù)量, 而 M 則是被返回位置元素的數(shù)量。
命令demo:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
5.3 GEORADIUS示例
vGEORADIUSBYMEMBER
6.1 GEORADIUSBYMEMBER概念
這個命令和 GEORADIUS 命令一樣, 都可以找出位于指定范圍內(nèi)的元素, 但是 GEORADIUSBYMEMBER 的中心點是由給定的位置元素決定的, 而不是像 GEORADIUS 那樣, 使用輸入的經(jīng)度和緯度來決定中心點。
時間復(fù)雜度: O(log(N)+M), 其中 N 為指定范圍之內(nèi)的元素數(shù)量, 而 M 則是被返回的元素數(shù)量。
6.2 GEORADIUSBYMEMBER命令
命令:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
6.3 GEORADIUSBYMEMBER示例
vSpingboot中使用方法
RedisTemplate redisTemplate;
redisTemplate.opsForGeo().geoAdd()
redisTemplate.opsForGeo().geoDist()
redisTemplate.opsForGeo().geoHash()
redisTemplate.opsForGeo().geoPos()
redisTemplate.opsForGeo().geoRadius()
redisTemplate.opsForGeo().geoRadiusByMember()
v源碼地址
作 者:http://www.cnblogs.com/toutou/
關(guān)于作者:專注于基礎(chǔ)平臺的項目開發(fā)。如有問題或建議,請多多賜教!
版權(quán)聲明:本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回復(fù)。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角【推薦】一下。您的鼓勵是作者堅持原創(chuàng)和持續(xù)寫作的最大動力!
總結(jié)
以上是生活随笔為你收集整理的redis 附近的人_Redis GEO地理位置信息,查看附近的人的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天线发射功率计算公式_怎样计算天线直径发
- 下一篇: 查看mysql 内核_如何查看和更新数据