最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis中的GEO詳解

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

Redis GEO

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

Redis GEO 操作方法有:

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

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

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

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

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

?Geohash 算法?

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

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

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

?二、常用命令詳解?

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

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

?語法?:
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)識(如店鋪名、用戶 ID)。

?功能?:向 key 中添加一個或多個地理位置(若成員已存在,則更新其經(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ù)成員不計入)。

?2. GEODIST:計算兩個位置的距離?

?語法?:
GEODIST key member1 member2 [unit]

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

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

?示例?:

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

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

?3. GEORADIUS:查詢指定中心點附近的成員?

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

  • longitude/latitude:中心點的經(jīng)緯度。
  • radius:搜索半徑。
  • unit:半徑單位(同 GEODIST)。
  • WITHCOORD:返回成員的經(jīng)緯度坐標(biāo)(數(shù)組形式)。
  • WITHDIST:返回成員到中心點的距離(浮點數(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"         # 到中心點的距離(km)
   3) 1) "116.405285"  # 經(jīng)度
      2) "39.904989"   # 緯度

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

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

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

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

?示例?:

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

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

?語法?:
GEOHASH key member [member ...]

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

?示例?:

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

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

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

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

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

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

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

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

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

?五、總結(jié)?

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

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

相關(guān)文章

  • Redis 旁路緩存深度解析

    Redis 旁路緩存深度解析

    旁路緩存是 Redis 最常用的緩存策略,本文主要介紹了Redis旁路緩存深度解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • redis過期key的刪除策略介紹

    redis過期key的刪除策略介紹

    這篇文章主要介紹了redis過期key的刪除策略,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Redis教程(十二):服務(wù)器管理命令總結(jié)

    Redis教程(十二):服務(wù)器管理命令總結(jié)

    這篇文章主要介紹了Redis教程(十二):服務(wù)器管理命令總結(jié),本文講解了CONFIGGETparameter、CONFIG SETparameter value、FLUSHALL等命令,需要的朋友可以參考下
    2015-04-04
  • 基于?Spring?Aop?環(huán)繞通知實現(xiàn)?Redis?緩存雙刪功能(示例代碼)

    基于?Spring?Aop?環(huán)繞通知實現(xiàn)?Redis?緩存雙刪功能(示例代碼)

    基于 spring aop 常規(guī)應(yīng)用場景多是用于日志記錄以及實現(xiàn) redis 分布式鎖,在 github 中也有項目是把它拿來當(dāng)作緩存的異常捕捉,這篇文章主要介紹了基于?Spring?Aop?環(huán)繞通知實現(xiàn)?Redis?緩存雙刪,需要的朋友可以參考下
    2022-08-08
  • Redis過期刪除策略與內(nèi)存淘汰策略

    Redis過期刪除策略與內(nèi)存淘汰策略

    這篇文章主要介紹了Redis過期刪除策略與內(nèi)存淘汰策略,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • 基于Redis?Set輕松實現(xiàn)簡單的抽獎系統(tǒng)

    基于Redis?Set輕松實現(xiàn)簡單的抽獎系統(tǒng)

    Redis Set集合是無序且元素唯一的String類型數(shù)據(jù)結(jié)構(gòu),支持高效增刪查改操作,包括獲取所有值、判斷包含關(guān)系、計算交并差集等,底層基于Hash表實現(xiàn)O(1)時間復(fù)雜度,這篇文章主要介紹了基于Redis?Set輕松實現(xiàn)簡單的抽獎系統(tǒng)的相關(guān)資料,需要的朋友可以參考下
    2026-03-03
  • 壓縮列表犧牲速度來節(jié)省內(nèi)存,Redis是膨脹了嗎

    壓縮列表犧牲速度來節(jié)省內(nèi)存,Redis是膨脹了嗎

    這篇文章主要給大家解釋了Redis 當(dāng)中的 ziplist(壓縮列表)犧牲速度來節(jié)省內(nèi)存的原因,希望大家能夠喜歡
    2021-02-02
  • redis lua腳本實戰(zhàn)秒殺和減庫存的實現(xiàn)

    redis lua腳本實戰(zhàn)秒殺和減庫存的實現(xiàn)

    本文主要是學(xué)習(xí)一下redis lua腳本的編寫,以及在redisson這個redis客戶端中是怎樣使用的,實戰(zhàn)一下秒殺場景redis減庫存lua腳本的編寫,并偽真實環(huán)境壓測查看效果。感興趣的可以了解一下
    2021-11-11
  • Redis解決跨域存取Session問題

    Redis解決跨域存取Session問題

    本文主要介紹了Redis解決跨域存取Session問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 關(guān)于redis可視化工具讀取數(shù)據(jù)亂碼問題

    關(guān)于redis可視化工具讀取數(shù)據(jù)亂碼問題

    大家來聊一聊在日常操作redis時用的是什么工具,redis提供的一些命令你都了解了嗎,今天通過本文給大家介紹redis可視化工具讀取數(shù)據(jù)亂碼問題,感興趣的朋友跟隨小編一起看看吧
    2021-07-07

最新評論

通道| 固始县| 宜良县| 民丰县| 淅川县| 肃宁县| 凌源市| 新安县| 海伦市| 黑龙江省| 甘洛县| 龙岩市| 甘洛县| 盘锦市| 杭锦旗| 剑阁县| 怀安县| 田阳县| 星座| 海淀区| 临海市| 临江市| 华容县| 花莲市| 边坝县| 陵川县| 卢氏县| 定边县| 会昌县| 平安县| 六安市| 江山市| 公主岭市| 遵化市| 前郭尔| 彭阳县| 东城区| 巴林右旗| 眉山市| 崇州市| 洪江市|