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

Redis中的GEO詳解

 更新時(shí)間:2025年06月18日 09:37:40   作者:悟能不能悟  
Redis GEO是一個(gè)輕量級(jí)的地理位置解決方案,適合需要快速存儲(chǔ)和查詢(xún)位置數(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ù)用戶(hù)給定的經(jīng)緯度坐標(biāo)來(lái)獲取指定范圍內(nèi)的地理位置集合。
  • georadiusbymember:根據(jù)儲(chǔ)存在位置集合里面的某個(gè)地點(diǎn)獲取指定范圍內(nèi)的地理位置集合。
  • geohash:返回一個(gè)或多個(gè)位置對(duì)象的 geohash 值。

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

?一、核心原理:基于 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)換而來(lái))。
  • ?成員(member)??:位置的標(biāo)識(shí)(如店鋪名 shop1)。

?Geohash 算法?

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

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

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

?二、常用命令詳解?

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

?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í)(如店鋪名、用戶(hù) ID)。

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

?示例?:

# 添加北京天安門(mén)(經(jīng)度116.405285,緯度39.904989)和上海東方明珠(經(jīng)度121.473701,緯度31.230416)
GEOADD stores 116.405285 39.904989 "天安門(mén)" 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ì)算天安門(mén)到東方明珠的距離(千米)
GEODIST stores "天安門(mén)" "東方明珠" km
# 輸出:約 1067.4702 km(實(shí)際計(jì)算值可能因精度略有差異)

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

?3. GEORADIUS:查詢(xún)指定中心點(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)緯度為中心,查詢(xún)半徑范圍內(nèi)的所有成員,并可選返回額外信息。

?示例?:

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

?返回值?(示例):

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

?4. GEORADIUSBYMEMBER:以成員為中心查詢(xún)附近?

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

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

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

?示例?:

# 查詢(xún)以“天安門(mén)”為中心,周?chē)?5 公里的店鋪
GEORADIUSBYMEMBER stores "天安門(mén)" 5 km WITHDIST

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

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

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

?示例?:

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

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

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

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

?三、關(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,因此 GEOADDGEORADIUS 等操作的時(shí)間復(fù)雜度與 ZSET 一致(如 GEORADIUS 為 O(N + log(M)),N 是結(jié)果數(shù)量,M 是總成員數(shù))。
    • 大數(shù)據(jù)量(如百萬(wàn)級(jí))下,范圍查詢(xún)可能變慢,建議結(jié)合業(yè)務(wù)場(chǎng)景優(yōu)化(如分區(qū)域緩存、限制 COUNT 參數(shù))。
  • ?精度問(wèn)題?:Geohash 編碼長(zhǎng)度固定為 52 位(對(duì)應(yīng) double 類(lèi)型的精度),足夠覆蓋絕大多數(shù)場(chǎng)景(誤差約 0.5 米),但極端情況下需注意。
  • ?集群支持?:Redis 集群模式下,GEO 數(shù)據(jù)會(huì)被分散存儲(chǔ)在不同節(jié)點(diǎn)(因 ZSET 的哈希槽分配),因此 GEORADIUS 等跨節(jié)點(diǎn)查詢(xún)需通過(guò)代理節(jié)點(diǎn)聚合結(jié)果,可能影響性能。

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

?附近的人/店鋪?:如外賣(mài) App 查詢(xún)用戶(hù)附近的餐廳,社交 App 查找附近的好友。

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

?五、總結(jié)?

Redis GEO 是一個(gè)輕量級(jí)的地理位置解決方案,適合需要快速存儲(chǔ)和查詢(xún)位置數(shù)據(jù)的場(chǎng)景。其核心優(yōu)勢(shì)是利用 ZSET 的有序性實(shí)現(xiàn)了高效的距離計(jì)算和范圍查詢(xún),但也需注意經(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 旁路緩存深度解析

    Redis 旁路緩存深度解析

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

    redis過(guò)期key的刪除策略介紹

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

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

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

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

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

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

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

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

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

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

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

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

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

    Redis解決跨域存取Session問(wèn)題

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

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

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

最新評(píng)論

萝北县| 容城县| 陵川县| 汶上县| 铜梁县| 丁青县| 五峰| 华宁县| 黄大仙区| 丹阳市| 广宗县| 淅川县| 肥城市| 乡城县| 武强县| 社会| 宣威市| 沾化县| 阿拉善左旗| 曲阳县| 永胜县| 舒兰市| 东莞市| 昌江| 丹东市| 左权县| 治多县| 集贤县| 丘北县| 万源市| 札达县| 海林市| 宜昌市| 武功县| 云龙县| 北海市| 新源县| 漠河县| 叶城县| 秀山| 新蔡县|