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

Redis中的GEO詳解

 更新時(shí)間:2025年06月18日 09:37:40   作者:悟能不能悟  
Redis GEO是一個(gè)輕量級(jí)的地理位置解決方案,適合需要快速存儲(chǔ)和查詢位置數(shù)據(jù)的場(chǎng)景,本文給大家介紹Redis的GEO詳解,感興趣的朋友一起看看吧

Redis GEO

Redis GEO 主要用于存儲(chǔ)地理位置信息,并對(duì)存儲(chǔ)的信息進(jìn)行操作,該功能在 Redis 3.2 版本新增。

Redis GEO 操作方法有:

  • geoadd:添加地理位置的坐標(biāo)。
  • geopos:獲取地理位置的坐標(biāo)。
  • geodist:計(jì)算兩個(gè)位置之間的距離。
  • georadius:根據(jù)用戶給定的經(jīng)緯度坐標(biāo)來獲取指定范圍內(nèi)的地理位置集合。
  • georadiusbymember:根據(jù)儲(chǔ)存在位置集合里面的某個(gè)地點(diǎn)獲取指定范圍內(nèi)的地理位置集合。
  • geohash:返回一個(gè)或多個(gè)位置對(duì)象的 geohash 值。

Redis 的 GEO(Geographic)模塊是用于處理地理位置信息的工具集,主要支持存儲(chǔ)地理位置數(shù)據(jù)計(jì)算位置間距離、查詢指定范圍內(nèi)的位置等功能。其底層基于有序集合(ZSET)實(shí)現(xiàn),利用了 ZSET 的排序特性來管理地理位置的排序和查詢。以下從核心原理、常用命令、應(yīng)用場(chǎng)景及注意事項(xiàng)等方面詳細(xì)說明:

?一、核心原理:基于 Geohash 和 ZSET?

Redis GEO 的底層數(shù)據(jù)結(jié)構(gòu)是 ?ZSET(有序集合)?,每個(gè)地理位置的成員(member)在 ZSET 中存儲(chǔ)為:

  • ?鍵(key)??:GEO 數(shù)據(jù)的鍵名(如 stores)。
  • ?分?jǐn)?shù)(score)??:成員的 Geohash 編碼值(一個(gè) 52 位的浮點(diǎn)數(shù),由經(jīng)緯度轉(zhuǎn)換而來)。
  • ?成員(member)??:位置的標(biāo)識(shí)(如店鋪名 shop1)。

?Geohash 算法?

Geohash 是一種將二維經(jīng)緯度(latitude, longitude)編碼為一維字符串的算法。其核心思想是通過二分法將經(jīng)緯度分別劃分為網(wǎng)格,最終生成一個(gè)由數(shù)字和字母組成的短字符串(長(zhǎng)度越短,精度越低,覆蓋范圍越大)。例如:

  • 北京天安門的經(jīng)緯度約為 (116.405285, 39.904989),對(duì)應(yīng)的 Geohash 是 wx4g0s8q3jf9。
  • 相鄰位置的 Geohash 字符串前綴相同,因此可通過比較前綴快速判斷位置的遠(yuǎn)近。

Redis 利用 Geohash 的這一特性,將地理位置存儲(chǔ)為 ZSET 的分?jǐn)?shù)(score),從而借助 ZSET 的有序性實(shí)現(xiàn)高效的距離計(jì)算和范圍查詢。

?二、常用命令詳解?

Redis GEO 提供了一系列命令,用于位置管理、距離計(jì)算和范圍查詢。以下是最核心的命令:

?1. GEOADD:添加/更新地理位置?

?語(yǔ)法?:
GEOADD key longitude latitude member [longitude latitude member ...]

  • key:GEO 數(shù)據(jù)的鍵名。
  • longitude:經(jīng)度(范圍:-180° ~ 180°,?注意順序:經(jīng)度在前,緯度在后)。
  • latitude:緯度(范圍:-90° ~ 90°)。
  • member:位置的唯一標(biāo)識(shí)(如店鋪名、用戶 ID)。

?功能?:向 key 中添加一個(gè)或多個(gè)地理位置(若成員已存在,則更新其經(jīng)緯度)。

?示例?:

# 添加北京天安門(經(jīng)度116.405285,緯度39.904989)和上海東方明珠(經(jīng)度121.473701,緯度31.230416)
GEOADD stores 116.405285 39.904989 "天安門" 121.473701 31.230416 "東方明珠"

?返回值?:成功添加的新成員數(shù)量(重復(fù)成員不計(jì)入)。

?2. GEODIST:計(jì)算兩個(gè)位置的距離?

?語(yǔ)法?:
GEODIST key member1 member2 [unit]

  • unit:距離單位,可選值:m(米,默認(rèn))、km(千米)、mi(英里)、ft(英尺)。

?功能?:計(jì)算 member1 和 member2 之間的直線距離。

?示例?:

# 計(jì)算天安門到東方明珠的距離(千米)
GEODIST stores "天安門" "東方明珠" km
# 輸出:約 1067.4702 km(實(shí)際計(jì)算值可能因精度略有差異)

?注意?:若任一成員不存在,返回 nil。

?3. GEORADIUS:查詢指定中心點(diǎn)附近的成員?

?語(yǔ)法?:
GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT n] [ASC|DESC]

  • longitude/latitude:中心點(diǎn)的經(jīng)緯度。
  • radius:搜索半徑。
  • unit:半徑單位(同 GEODIST)。
  • WITHCOORD:返回成員的經(jīng)緯度坐標(biāo)(數(shù)組形式)。
  • WITHDIST:返回成員到中心點(diǎn)的距離(浮點(diǎn)數(shù))。
  • WITHHASH:返回成員的 Geohash 編碼值(整數(shù))。
  • COUNT n:限制返回結(jié)果數(shù)量(默認(rèn)返回所有符合條件的成員)。
  • ASC|DESC:按距離升序(ASC,默認(rèn))或降序(DESC)排序。

?功能?:以給定的經(jīng)緯度為中心,查詢半徑范圍內(nèi)的所有成員,并可選返回額外信息。

?示例?:

# 查詢天安門(116.405285, 39.904989)周圍 2 公里內(nèi)的店鋪,返回距離和坐標(biāo)
GEORADIUS stores 116.405285 39.904989 2 km WITHDIST WITHCOORD

?返回值?(示例):

1) 1) "天安門"          # 成員名
   2) "0.0000"         # 到中心點(diǎn)的距離(km)
   3) 1) "116.405285"  # 經(jīng)度
      2) "39.904989"   # 緯度

?4. GEORADIUSBYMEMBER:以成員為中心查詢附近?

?語(yǔ)法?:
GEORADIUSBYMEMBER key member radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT n] [ASC|DESC]

  • member:作為中心點(diǎn)的已有成員(如已存在的店鋪)。

?功能?:與 GEORADIUS 類似,但中心點(diǎn)由已有成員的位置決定(無需手動(dòng)輸入經(jīng)緯度)。

?示例?:

# 查詢以“天安門”為中心,周圍 5 公里的店鋪
GEORADIUSBYMEMBER stores "天安門" 5 km WITHDIST

?5. GEOHASH:獲取成員的 Geohash 編碼?

?語(yǔ)法?:
GEOHASH key member [member ...]

?功能?:返回一個(gè)或多個(gè)成員的 Geohash 字符串(基于 ZSET 的分?jǐn)?shù)轉(zhuǎn)換而來)。

?示例?:

# 獲取“天安門”的 Geohash
GEOHASH stores "天安門"
# 輸出:"wx4g0s8q3jf9"(實(shí)際值可能因 Redis 版本略有差異)

?應(yīng)用場(chǎng)景?:通過比較 Geohash 前綴快速判斷位置的相似性(前綴越長(zhǎng),位置越接近)。

?6. GEORADIUSBYMEMBER_RO / GEORADIUS_RO:只讀查詢(Redis 3.2.10+)??

為了支持集群模式下的只讀操作,Redis 提供了 GEORADIUSBYMEMBER_RO(基于成員)和 GEORADIUS_RO(基于經(jīng)緯度)命令,避免在集群環(huán)境中因重定向?qū)е碌男阅軉栴}。

?三、關(guān)鍵注意事項(xiàng)?

  • ?經(jīng)緯度順序?:必須嚴(yán)格遵循 經(jīng)度在前,緯度在后(與地理常識(shí)中的“緯度優(yōu)先”不同),否則會(huì)導(dǎo)致位置錯(cuò)誤。
  • ?數(shù)據(jù)刪除?:GEO 數(shù)據(jù)存儲(chǔ)在 ZSET 中,因此刪除成員需使用 ZREM key member(而非 GEODEL,Redis 未提供獨(dú)立刪除命令)。
  • ?性能限制?:
    • 底層是 ZSET,因此 GEOADD、GEORADIUS 等操作的時(shí)間復(fù)雜度與 ZSET 一致(如 GEORADIUS 為 O(N + log(M)),N 是結(jié)果數(shù)量,M 是總成員數(shù))。
    • 大數(shù)據(jù)量(如百萬級(jí))下,范圍查詢可能變慢,建議結(jié)合業(yè)務(wù)場(chǎng)景優(yōu)化(如分區(qū)域緩存、限制 COUNT 參數(shù))。
  • ?精度問題?:Geohash 編碼長(zhǎng)度固定為 52 位(對(duì)應(yīng) double 類型的精度),足夠覆蓋絕大多數(shù)場(chǎng)景(誤差約 0.5 米),但極端情況下需注意。
  • ?集群支持?:Redis 集群模式下,GEO 數(shù)據(jù)會(huì)被分散存儲(chǔ)在不同節(jié)點(diǎn)(因 ZSET 的哈希槽分配),因此 GEORADIUS 等跨節(jié)點(diǎn)查詢需通過代理節(jié)點(diǎn)聚合結(jié)果,可能影響性能。

?四、典型應(yīng)用場(chǎng)景?

?附近的人/店鋪?:如外賣 App 查詢用戶附近的餐廳,社交 App 查找附近的好友。

# 用戶當(dāng)前位置(經(jīng)度121.475,緯度31.230),查詢 3 公里內(nèi)的餐廳
GEORADIUS restaurants 121.475 31.230 3 km WITHDIST
  • ?物流追蹤?:記錄包裹的實(shí)時(shí)位置,查詢某區(qū)域內(nèi)的待配送訂單。
  • ?地理圍欄?:判斷移動(dòng)對(duì)象(如車輛)是否進(jìn)入或離開指定區(qū)域(結(jié)合 GEORADIUS 和定時(shí)任務(wù))。

?五、總結(jié)?

Redis GEO 是一個(gè)輕量級(jí)的地理位置解決方案,適合需要快速存儲(chǔ)和查詢位置數(shù)據(jù)的場(chǎng)景。其核心優(yōu)勢(shì)是利用 ZSET 的有序性實(shí)現(xiàn)了高效的距離計(jì)算和范圍查詢,但也需注意經(jīng)緯度順序、數(shù)據(jù)刪除方式和性能限制。實(shí)際使用中,需根據(jù)業(yè)務(wù)需求選擇合適的命令(如 GEORADIUS 或 GEORADIUSBYMEMBER),并結(jié)合 WITH* 參數(shù)優(yōu)化返回結(jié)果。

到此這篇關(guān)于Redis中的GEO詳解的文章就介紹到這了,更多相關(guān)Redis GEO內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用

    Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用

    這篇文章主要為大家介紹了Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Redis實(shí)現(xiàn)限流器的三種方法(小結(jié))

    Redis實(shí)現(xiàn)限流器的三種方法(小結(jié))

    本文主要介紹了Redis實(shí)現(xiàn)限流器的三種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Redis中的BigKey問題排查與解決思路詳解

    Redis中的BigKey問題排查與解決思路詳解

    Redis是一款性能強(qiáng)勁的內(nèi)存數(shù)據(jù)庫(kù),但是在使用過程中,我們可能會(huì)遇到Big Key問題,這個(gè)問題就是Redis中某個(gè)key的value過大,所以Big Key問題本質(zhì)是Big Value問題,這篇文章主要介紹了Redis中的BigKey問題:排查與解決思路,需要的朋友可以參考下
    2023-03-03
  • 為何Redis使用跳表而非紅黑樹實(shí)現(xiàn)SortedSet

    為何Redis使用跳表而非紅黑樹實(shí)現(xiàn)SortedSet

    本篇文章主要介紹了為何Redis使用跳表而非紅黑樹實(shí)現(xiàn)SortedSet,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Redis三種特殊數(shù)據(jù)類型的具體使用

    Redis三種特殊數(shù)據(jù)類型的具體使用

    本文主要介紹了Redis三種特殊數(shù)據(jù)類型的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Redis 緩存滿了如何解決

    Redis 緩存滿了如何解決

    Redis 緩存使用內(nèi)存來保存數(shù)據(jù),隨著需要緩存的數(shù)據(jù)量越來越大,有限的緩存空間不可避免地會(huì)被寫滿,本文主要介紹了Redis 緩存滿了如何解決,感興趣的可以了解一下
    2023-08-08
  • Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí)

    Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí)

    這篇文章主要為大家介紹了Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Redis中LRU算法和LFU算法的區(qū)別小結(jié)

    Redis中LRU算法和LFU算法的區(qū)別小結(jié)

    在Redis中,LRU算法和LFU算法是兩種常用的緩存淘汰算法,它們可以幫助我們優(yōu)化緩存性能,本文主要介紹了Redis中LRU算法和LFU算法的區(qū)別,感興趣的可以了解一下
    2023-12-12
  • 基于redis實(shí)現(xiàn)世界杯排行榜功能項(xiàng)目實(shí)戰(zhàn)

    基于redis實(shí)現(xiàn)世界杯排行榜功能項(xiàng)目實(shí)戰(zhàn)

    前段時(shí)間,做了一個(gè)世界杯競(jìng)猜積分排行榜。對(duì)世界杯64場(chǎng)球賽勝負(fù)平進(jìn)行猜測(cè),猜對(duì)+1分,錯(cuò)誤+0分,一人一場(chǎng)只能猜一次。下面通過本文給大家分享基于redis實(shí)現(xiàn)世界杯排行榜功能項(xiàng)目實(shí)戰(zhàn),感興趣的朋友一起看看吧
    2018-10-10
  • Redis基本數(shù)據(jù)類型Zset有序集合常用操作

    Redis基本數(shù)據(jù)類型Zset有序集合常用操作

    這篇文章主要為大家介紹了redis基本數(shù)據(jù)類型Zset有序集合常用操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論