欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis GEO地理信息定位功能

 更新時間:2023年12月25日 10:48:05   作者:Ethanchen's notes  
Redis 提供了GEO地理信息定位功能,地理空間項(經(jīng)度、緯度、名稱),實現(xiàn)查找附近的人、上班打卡、自行車租賃、搖一搖等相關(guān)與地理位置信息的功能,這篇文章主要介紹了Redis GEO地理信息定位功能,需要的朋友可以參考下

GEO

Redis 提供了GEO地理信息定位功能,地理空間項(經(jīng)度、緯度、名稱),實現(xiàn)查找附近的人、上班打卡、自行車租賃、搖一搖等相關(guān)與地理位置信息的功能。 Redis 地理空間索引可讓您存儲坐標(biāo)并搜索它們。 此數(shù)據(jù)結(jié)構(gòu)對于查找給定半徑或邊界框內(nèi)的附近點非常有用。

基本命令

  • GEOADD將位置添加到給定的地理空間索引(請注意,使用此命令時,經(jīng)度位于緯度之前)。
  • GEOSEARCH返回具有給定半徑或邊界框的位置。

GEOADD

將指定的地理空間項(經(jīng)度、緯度、名稱)添加到指定的鍵。數(shù)據(jù)作為排序集存儲到鍵中,這樣就可以使用 GEOSEARCH 命令查詢項目。

該命令采用標(biāo)準(zhǔn)格式 x,y 的參數(shù),因此必須在緯度之前指定經(jīng)度??伤饕淖鴺?biāo)存在限制:非??拷鼧O點的區(qū)域不可索引。

當(dāng)用戶嘗試索引指定范圍之外的坐標(biāo)時,該命令將報告錯誤。

通常,Redis 使用 Geohash 的變體來表示元素的位置 使用 52 位整數(shù)對位置進(jìn)行編碼的技術(shù)。編碼是 與標(biāo)準(zhǔn)相比也不同,因為初始最小值和最大值 編碼和解碼過程中使用的坐標(biāo)是不同的。

longitude 經(jīng)度 、latitude 緯度、member 成員

GEOADD key [NX | XX] [CH] longitude latitude member [longitude
  latitude member ...]

以下添加5個城市經(jīng)緯度到 鍵 cities:geo, 如果已經(jīng)存在則返回0,如果需要更新地理位置,同樣使用GEOADD命令(僅管返回0)。

# 北京
192.168.88.11:6380> GEOADD cities:geo 116.28 39.54 beijing
(integer) 1
# 天津
192.168.88.11:6380> GEOADD cities:geo 117.10 39.10 tianjin 
(integer) 1
# 廣州
192.168.88.11:6380> GEOADD cities:geo 113.18 23.10 guangzhou
(integer) 1
# 杭州
192.168.88.11:6380> GEOADD cities:geo 120.10 30.15 hangzhou
(integer) 1
# 長沙
192.168.88.11:6380> GEOADD cities:geo 112.55 28.12 changsha
(integer) 1

注意:沒有GEODEL命令,因為您可以使用ZREM 刪除元素。 Geo索引結(jié)構(gòu)只是一個排序集。本質(zhì)是 zset 數(shù)據(jù)類型。

# 查看成員
192.168.88.11:6380> ZRANGE cities:geo 0 5
1) "guangzhou"
2) "changsha"
3) "hangzhou"
4) "beijing"
5) "tianjin"
# 查看成員帶分?jǐn)?shù)
192.168.88.11:6380> ZRANGE cities:geo 0 5 withscores
 1) "guangzhou"
 2) "4046510568184210"
 3) "changsha"
 4) "4050880415755396"
 5) "hangzhou"
 6) "4054121680734333"
 7) "beijing"
 8) "4069140601296155"
 9) "tianjin"
10) "4069185531597821"
# 集合大?。?5
192.168.88.11:6380> ZCARD cities:geo
(integer) 5
# 刪除兩個元素
192.168.88.11:6380> ZREM cities:geo changsha hangzhou
(integer) 2
# 集合大小: 3
192.168.88.11:6380> ZCARD cities:geo
(integer) 3

如何計算 “beijing” 經(jīng)緯度(116.28, 39.54) 的分值 4069140601296155 ? 排序集的填充方式是使用一種叫做Geohash的技術(shù)。經(jīng)度位和緯度位相互交錯,形成一個唯一的52位整數(shù)。

EPSG:900913 / EPSG:3785 / OSGEO:41001 指定的確切限制如下:

  • 有效經(jīng)度范圍為 -180 到 180 度。
  • 有效緯度范圍為 -85.05112878 到 85.05112878 度。

按下面的編碼為N=26位二進(jìn)制值 ,然后把經(jīng)緯度交叉組成52位二進(jìn)制值即可。 (偶數(shù)位為經(jīng)度、奇數(shù)位為緯度)

這里,可以通過python腳本定義兩個列表,然后不斷拆分區(qū)間,最后做交叉合拼兩個列表。結(jié)果如下:

root@ubuntu-x64_01:/opt# python3 redis_geo_bit.py 
guangzhou---> 1110011000000100011110101000111111110001100110010010
changsha ---> 1110011001000100000100011000001101010110110010000100
hangzhou ---> 1110011001110011001111000010101010000000100001111101
beijing  ---> 1110011101001101110010100000000101001101010100011011
tianjin  ---> 1110011101001110011100010110001000101101001111111101

再轉(zhuǎn)換成十進(jìn)制,就是 zset 的分?jǐn)?shù)值,比如 guangzhou (1110011000000100011110101000111111110001100110010010)對應(yīng)十進(jìn)制 : 4046510568184210

192.168.88.11:6380> ZRANGE cities:geo 0 0 withscores
1) "guangzhou"
2) "4046510568184210"

GEOHASH

返回有效的Geohash 字符串,表示一個或多個元素在表示地理空間索引的排序集值中的位置(其中元素是使用GEOADD)。

該命令返回11個字符的Geohash字符串,因此與Redis內(nèi)部52位表示相比,沒有精度損失。

  • 他們可以縮短,從右邊刪除字符。它將失去精度,但仍然指向相同的區(qū)域。
  • 可以在geohash.org url中使用它們,例如http://geohash.org/<geohash-string>。
  • 具有相似前綴的字符串在附近,但反之則不成立,具有不同前綴的字符串也可能在附近。

字符串越長,表示的位置更精確,例如geohash長度為8時,精度在19米左右。

下面操作返回 beijing 的 geohash 值,如下:

192.168.88.11:6380> GEOHASH cities:geo beijing
1) "wx48yn090q0"

可以在geohash.org url中使用它們: http://geohash.org/wx48yn090q0

GEOPOS

返回由排序集key表示的地理空間索引中所有指定成員的位置(經(jīng)度、緯度)。當(dāng)通過GEOADD填充地理空間索引時,坐標(biāo)被轉(zhuǎn)換為52位geohash,因此返回的坐標(biāo)可能不完全是用于添加元素的坐標(biāo),但可能會引入小誤差。

192.168.88.11:6380> GEOPOS cities:geo guangzhou
1) 1) "113.18000167608261108"
   2) "23.10000005307264104"
192.168.88.11:6380> GEOPOS cities:geo changsha
1) 1) "112.54999905824661255"
   2) "28.12000010081647616"
192.168.88.11:6380> GEOPOS cities:geo hangzhou
1) 1) "120.09999901056289673"
   2) "30.14999997874437554"
192.168.88.11:6380> GEOPOS cities:geo beijing
1) 1) "116.28000229597091675"
   2) "39.54000124957348561"
192.168.88.11:6380> GEOPOS cities:geo tianjin
1) 1) "117.10000187158584595"
   2) "39.09999900352384117"

GEODIST

返回由排序集表示的地理空間索引中兩個成員之間的距離。

給定一個表示地理空間索引的排序集,使用GEOADD命令填充,該命令返回指定單元中兩個指定成員之間的距離。

如果缺少一個或兩個成員,則該命令返回NULL。

單位必須為以下之一,默認(rèn)為米:

  • m for meters. 代表米
  • km for kilometers. 代表公里
  • mi for miles.代表英里
  • ft for feet. 代表尺

如計算北京與天津之間的距離,并以公里為單位返回,如下:

192.168.88.11:6380> GEODIST cities:geo beijing tianjin km
"85.8689"

GEORADIUS

獲取指定位置范圍內(nèi)的地理信息位置集合,返回使用GEOADD填充地理空間信息的已排序集合的成員,這些成員位于用中心位置和到中心的最大距離(半徑)指定的區(qū)域的邊界內(nèi)。

該命令的常見用例是檢索指定點附近的地理空間項目,距離不超過給定的米(或其他單位)。例如,這允許向應(yīng)用程序附近的移動用戶提供建議。

單位必須為以下之一,默認(rèn)為米:

  • m for meters. 代表米
  • km for kilometers. 代表公里
  • mi for miles.代表英里
  • ft for feet. 代表尺:
GEORADIUS key longitude latitude radius <M | KM | FT | MI>
  [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC]
  [STORE key | STOREDIST key]

該命令可以使用以下選項返回附加信息:

  • WITHDIST: 返回結(jié)果中包含到指定中心的距離。返回的距離單位與命令的radius參數(shù)指定的單位相同。
  • WITHCOORD: 返回結(jié)果中包含經(jīng)度、緯度坐標(biāo)。
  • WITHHASH: 以52位無符號整數(shù)的形式返回該項的原始geohash編碼的排序集分?jǐn)?shù)。

該命令默認(rèn)返回未排序的項。可以使用以下兩個選項調(diào)用兩種不同的排序方法:

  • ASC: 對返回的項目進(jìn)行排序,從最近到最遠(yuǎn),相對于中心。
  • DESC: 相對于中心,從最遠(yuǎn)到最近對返回項進(jìn)行排序。

默認(rèn)情況下,返回所有匹配項。通過使用COUNT < COUNT >選項,可以將結(jié)果限制為前N個匹配項。

  • 當(dāng)提供ANY時,只要找到足夠的匹配項,命令就會返回,因此結(jié)果可能不是最接近指定點的結(jié)果,但另一方面,服務(wù)器投入的精力大大降低了。
  • 當(dāng)沒有提供ANY時,該命令將執(zhí)行與指定區(qū)域匹配的項數(shù)成比例的工作,并對它們進(jìn)行排序,因此使用非常小的COUNT選項查詢非常大的區(qū)域可能很慢,即使只返回幾個結(jié)果。

默認(rèn)情況下,該命令將條目返回給客戶端??梢允褂靡韵逻x項之一來存儲結(jié)果:

  • STORE:將項目存儲在使用其地理空間信息填充的已排序集合中。
  • STOREDIST:將項目存儲在一個排序的集合中,該集合以與中心的距離作為浮點數(shù)填充,在半徑中指定的相同單位中

如,計算距離 北京 200公里 以內(nèi)的城市:

192.168.88.11:6380> GEORADIUS cities:geo 116.28 39.54 200 km
1) "beijing"
2) "tianjin"
192.168.88.11:6380> GEORADIUS cities:geo 116.28 39.54 200 km WITHCOORD WITHDIST WITHHASH
1) 1) "beijing"
   2) "0.0002"
   3) (integer) 4069140601296155
   4) 1) "116.28000229597091675"
      2) "39.54000124957348561"
2) 1) "tianjin"
   2) "85.8690"
   3) (integer) 4069185531597821
   4) 1) "117.10000187158584595"
      2) "39.09999900352384117"
192.168.88.11:6380> GEORADIUS cities:geo 116.28 39.54 200 km WITHCOORD WITHDIST WITHHASH COUNT 1 DESC
1) 1) "tianjin"
   2) "85.8690"
   3) (integer) 4069185531597821
   4) 1) "117.10000187158584595"
      2) "39.09999900352384117"
# 將項目存儲在使用其地理空間信息填充的已排序集合中。
192.168.88.11:6380> GEORADIUS cities:geo 116.28 39.54 200 km COUNT 1 DESC STORE cities:georadius
(integer) 1
192.168.88.11:6380> type cities:georadius
zset
192.168.88.11:6380> ZRANGE cities:georadius 0 5 withscores
1) "tianjin"
2) "4069185531597821"

小結(jié)

  • 沒有GEODEL命令,因為您可以使用它ZREM來刪除元素。Geo索引結(jié)構(gòu)只是一個排序集。GEO沒有提供刪除成員的命令,因為GEO的底層實現(xiàn)是zset,如果要刪除成員,請使用 zrem 命令來對地理位置信息進(jìn)行刪除。
  • 當(dāng)通過GEOADD填充地理空間索引時,坐標(biāo)被轉(zhuǎn)換為52位geohash,因此返回的坐標(biāo)可能不完全是用于添加元素的坐標(biāo),即可能會引入小誤差。
  • 填充排序集的方式是使用一種稱為 Geohash的技術(shù)。緯度和經(jīng)度位交錯形成唯一的 52 位整數(shù)。

到此這篇關(guān)于Redis GEO地理信息定位功能的文章就介紹到這了,更多相關(guān)Redis GEO地理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis實現(xiàn)會話管理和token認(rèn)證的示例代碼

    Redis實現(xiàn)會話管理和token認(rèn)證的示例代碼

    會話管理和身份認(rèn)證是實現(xiàn)用戶登錄、權(quán)限管理等功能的基礎(chǔ),本文主就來介紹一下Redis實現(xiàn)會話管理和token認(rèn)證的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2025-04-04
  • Redis KEYS查詢大批量數(shù)據(jù)替代方案

    Redis KEYS查詢大批量數(shù)據(jù)替代方案

    在使用 Redis 時,KEYS 命令雖然簡單直接,但其全表掃描的特性在處理大規(guī)模數(shù)據(jù)時會導(dǎo)致性能問題,甚至可能阻塞 Redis 服務(wù),本文將介紹SCAN命令、有序集合、哈希表和RediSearch模塊四種替代 KEYS 的高效方案,需要的朋友可以參考下
    2024-12-12
  • Redis教程(四):Hashes數(shù)據(jù)類型

    Redis教程(四):Hashes數(shù)據(jù)類型

    這篇文章主要介紹了Redis教程(四):Hashes數(shù)據(jù)類型,本文講解了Hashes數(shù)據(jù)類型概述、相關(guān)命令列表和命令使用示例等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • redis啟動失敗問題之完美解決方案

    redis啟動失敗問題之完美解決方案

    這篇文章主要介紹了redis啟動失敗問題之完美解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • redis樂觀鎖與悲觀鎖的實戰(zhàn)?

    redis樂觀鎖與悲觀鎖的實戰(zhàn)?

    Redis提供了兩種鎖機(jī)制,即樂觀鎖和悲觀鎖。本文主要介紹了redis樂觀鎖與悲觀鎖的實戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Redis的主從同步解析

    Redis的主從同步解析

    這篇文章主要介紹了Redis的主從同步解析,見識淺薄,僅供參考。
    2017-10-10
  • redis分布式Jedis類型轉(zhuǎn)換的異常深入研究

    redis分布式Jedis類型轉(zhuǎn)換的異常深入研究

    這篇文章主要介紹了redis分布式Jedis類型轉(zhuǎn)換的異常深入研究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Redis SETEX命令實現(xiàn)鍵值對管理

    Redis SETEX命令實現(xiàn)鍵值對管理

    本文主要介紹了Redis SETEX命令實現(xiàn)鍵值對管理,SETEX命令用于設(shè)置具有過期時間的鍵值對,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Redis兩種持久化方案RDB和AOF詳解

    Redis兩種持久化方案RDB和AOF詳解

    這篇文章主要介紹了Redis 兩種持久化方案,RDB(Redis DataBase)和 AOF(Append Only File),給大家提供參考,一起學(xué)習(xí)下。
    2017-11-11
  • Redis中哈希結(jié)構(gòu)(Dict)的實現(xiàn)

    Redis中哈希結(jié)構(gòu)(Dict)的實現(xiàn)

    本文主要介紹了Redis中哈希結(jié)構(gòu)(Dict)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評論