首頁  >  文章  >  資料庫  >  Redis特殊資料類型之Geospatial

Redis特殊資料類型之Geospatial

WBOY
WBOY轉載
2022-10-12 16:21:351591瀏覽

在先前的《Redis特殊資料類型之stream》文章中為大家介紹了關於資料類型stream的相關內容,這篇文章為大家帶來了Redis中的另一個資料類型Geospatial,下面一起來看一下,希望對大家有幫助。

Redis特殊資料類型之Geospatial

推薦學習:Redis影片教學

#前言

##我們都知道Redis提供了豐富的資料類型,特殊的有四種:BitMap、HyperLogLog、Geospatial、Stream。

今天我們就來詳細的聊聊Redis 這四個特殊的資料類型之一Geospatial;

#應用程式場景:儲存地理位置資訊的場景,例如滴滴叫車;

概述簡介

著作權歸作者所有。商業轉載請聯絡作者授權,非商業轉載請註明出處。

Redis Geospatial 是 Redis 3.2 版本新增的資料類型,主要用於儲存地理位置信息,並對儲存的資訊進行操作。

在日常生活中,我們越來越依賴搜尋 「附近的餐廳」、在叫車軟體上叫車,這些都離不開基於位置資訊服務(Location-Based Service,LBS)的應用程式。 LBS 應用存取的資料是和人或物關聯的一組經緯度信息,而且要能查詢相鄰的經緯度範圍,GEO 就非常適合應用在 LBS 服務的場景中。

內部實作

GEO 本身並沒有設計新的底層資料結構,而是直接使用了 Sorted Set 集合類型。

GEO 類型使用 GeoHash 編碼方法實現了經緯度到 Sorted Set 中元素權重分數的轉換,這其中的兩個關鍵機制就是「對二維地圖做區間劃分」和「對區間進行編碼」。一組經緯度落在某個區間後,就用區間的編碼值來表示,並將編碼值當作 Sorted Set 元素的權重分數。

這樣一來,我們就可以把經緯度保存到Sorted Set 中,利用Sorted Set 提供的「按權重進行有序範圍查找」的特性,實現LBS 服務中頻繁使用的「搜尋附近」的需求。

常用指令
# 存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。
GEOADD key longitude latitude member [longitude latitude member ...]
# 从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
GEOPOS key member [member ...]
# 返回两个给定位置之间的距离。
GEODIST key member1 member2 [m|km|ft|mi]
# 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

應用場景

#滴滴叫車

這裡以滴滴叫車的場景為例,介紹下具體如何使用GEO 指令:GEOADD 和GEORADIUS 這兩個指令。

假設車輛 ID 是 33,經緯度位置是(116.034579,39.030452),我們可以用一個 GEO 集合保存所有車輛的經緯度,集合 key 是 cars:locations。

執行下面的這個指令,就可以把ID 號碼為33 的車輛的目前經緯度位置存入GEO 集合中:

GEOADD cars:locations 116.034579 39.030452 33

當使用者想要尋找自己附近的叫車時,LBS 應用程式就可以使用GEORADIUS 指令。

例如,LBS 應用執行下面的命令時,Redis 會根據輸入的使用者的經緯度資訊(116.054579,39.030452 ),尋找以這個經緯度為中心的5 公里內的車輛資訊,並返回給LBS 應用。

GEORADIUS cars:locations 116.054579 39.030452 5 km ASC COUNT 10

推薦學習:

Redis影片教學#

以上是Redis特殊資料類型之Geospatial的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.im。如有侵權,請聯絡admin@php.cn刪除