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