1. 程式人生 > >redis3.2新功能--GEO地理位置命令介紹

redis3.2新功能--GEO地理位置命令介紹

概述

redis3.2釋出rc版本已經有一段時間了,估計RedisConf 2016左右,3.2版本就能release了。3.2版本中增加的最大功能就是對GEO(地理位置)的支援。說起redis的GEO特性,最大的貢獻還是咱們中國人。redis作者在對3.2引進新特性的部落格中介紹了為什麼支援GEO。GEO hashing的api是在Ardb實現的,Ardb是github使用者yinqiwen實現的基於redis協議實現的nosql系統,Ardb支援除了redis、還有LevelDB、RocksDB
、LMDB等kv引擎。其中Ardb實現了GEO hashing功能。從Ardb作者的使用者名稱和標識的位置在深圳可以看出Ardb作者應該是咱中國人。Ardb是用c++寫的。redis另一個開發者Matt Stancliff從Ardb提取GEO庫,用C語言改寫,整合進redis的一個自己的分支,並被redis作者接受,合併進了3.2版本。GEO目前提供以下6個命令。

  • 1、geoadd:增加某個地理位置的座標。
  • 2、geopos:獲取某個地理位置的座標。
  • 3、geodist:獲取兩個地理位置的距離。
  • 4、georadius:根據給定地理位置座標獲取指定範圍內的地理位置集合。
  • 5、georadiusbymember:根據給定地理位置獲取指定範圍內的地理位置集合。
  • 6、geohash:獲取某個地理位置的geohash值。

地理位置的座標是以WGS84為標準,WGS84,全稱World Geodetic System 1984,是為GPS全球定位系統使用而建立的座標系統。

GEO命令

下面來看看具體每個命令的用法。

geoadd

geoadd用來增加地理位置的座標,可以批量新增地理位置,命令格式為:

GEOADD key longitude latitude member [longitude latitude member ...]

key標識一個地理位置的集合。longitude latitude member標識了一個地理位置的座標。longitude是地理位置的經度,latitude是地理位置的緯度。member是該地理位置的名稱。GEOADD可以批量給集合新增一批地理位置。

geopos

geopos可以獲取地理位置的座標,可以批量獲取多個地理位置的座標,命令格式為:

GEOPOS key member [member ...]

geodist

geodist用來獲取兩個地理位置的距離,命令格式為:

GEODIST key member1 member2 [m|km|ft|mi]

單位可以指定為以下四種類型:

  • m:米,距離單位預設為米,不傳遞該引數則單位為米。
  • km:公里。
  • mi:英里。
  • ft:英尺。

georadius

georadius可以根據給定地理位置座標獲取指定範圍內的地理位置集合。命令格式為:

GEORADIUS key longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]

longitude latitude標識了地理位置的座標,radius表示範圍距離,距離單位可以為m|km|ft|mi,還有一些可選引數:

  • WITHCOORD:傳入WITHCOORD引數,則返回結果會帶上匹配位置的經緯度。
  • WITHDIST:傳入WITHDIST引數,則返回結果會帶上匹配位置與給定地理位置的距離。
  • ASC|DESC:預設結果是未排序的,傳入ASC為從近到遠排序,傳入DESC為從遠到近排序。
  • WITHHASH:傳入WITHHASH引數,則返回結果會帶上匹配位置的hash值。
  • COUNT count:傳入COUNT引數,可以返回指定數量的結果。

georadiusbymember

georadiusbymember可以根據給定地理位置獲取指定範圍內的地理位置集合。georadius命令傳遞的是座標,georadiusbymember傳遞的是地理位置。georadius更為靈活,可以獲取任何座標點範圍內的地理位置。但是大多數時候,只是想獲取某個地理位置附近的其他地理位置,使用georadiusbymember則更為方便。georadiusbymember命令格式為(命令可選引數與georadius含義一樣):

GEORADIUSBYMEMBER key member radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]

geohash

geohash可以獲取某個地理位置的geohash值。geohash是將二維的經緯度轉換成字串hash值的演算法,後面會具體介紹geohash原理。可以批量獲取多個地理位置的geohash值。命令格式為:

GEOHASH key member [member ...]

redis GEO實現

redis GEO實現主要包含了以下兩項技術:

  • 1、使用geohash儲存地理位置的座標。
  • 2、使用有序集合(zset)儲存地理位置的集合。

geohash

geohash的思想是將二維的經緯度轉換成一維的字串,geohash有以下三個特點:

  • 1、字串越長,表示的範圍越精確。編碼長度為8時,精度在19米左右,而當編碼長度為9時,精度在2米左右。
  • 2、字串相似的表示距離相近,利用字串的字首匹配,可以查詢附近的地理位置。這樣就實現了快速查詢某個座標附近的地理位置。
  • 3、geohash計算的字串,可以反向解碼出原來的經緯度。

這三個特性讓geohash特別適合表示二維hash值。這篇文章:GeoHash核心原理解析詳細的介紹了geohash的原理,想要了解geohash實現的朋友可以參考這篇文章。

redis GEO命令實現

知道了redis使用有序集合(zset)儲存地理位置資料(想了解redis有序集合的,可以參看這篇文章《有序集合物件》),以及geohash的特性,就很容易理解redis是如何實現redis GEO命令了。細心的讀者可能發現,redis沒有實現地理位置的刪除命令。不過由於GEO資料儲存在zset中,可以用zrem來刪除某個地理位置。

  • geoadd命令增加地理位置的時候,會先計算地理位置座標的geohash值,然後地理位置作為有序集合的member,geohash作為該member的score。然後使用zadd命令插入到有序集合。
  • geopos命令則先根據地理位置獲取geohash值,然後decode得到地理位置的座標。
  • geodist命令先根據兩個地理位置各自得到座標,然後計算兩個座標的距離。
  • georadius和georadiusbymember使用相同的實現,georadiusbymember多了一步把地理位置轉換成對應的座標。然後查詢該座標和周圍對應8個座標符合距離要求的地理位置。因為geohash得到的值其實是個格子,並不是點,這樣通過計算周圍對應8個座標就能解決邊緣問題。由於使用有序集合儲存地理位置,在對地列位置基於範圍查詢,就相當於實現了zrange命令,內部的實現確實與zrange命令一致,只是geo有些特別的處理,比如獲得的某個地理位置,還需要計算該地理位置是否符合給定的距離訪問。
  • geohash則直接返回了地理位置的geohash值。

redis關於geohash使用了Ardb的geohash庫geohash-int,redis使用的geohash編碼長度為26位。可以精確到0.59m的精度。

總結

通過本文,撥開GEO身後的雲霧,可以看出redis藉助了有序集合(zset)和geohash,加上redis本身實現的命令框架,可以很容易的實現地理位置相關的命令。

參考文獻:

相關推薦

redis3.2功能--GEO地理位置命令介紹

概述 redis3.2釋出rc版本已經有一段時間了,估計RedisConf 2016左右,3.2版本就能release了。3.2版本中增加的最大功能就是對GEO(地理位置)的支援。說起redis的GEO特性,最大的貢獻還是咱們中國人。redis作者在對3.2引進新特性的部落格中介紹了為什麼支援GEO。G

redis GEO地理位置命令介紹

each limits 排序。 ima 字符 lex member pat uniq GEOADD keylongitude latitude member [longitude latitude member ...] Available since 3.2.0. T

【DevExpress v17.2功能預告】改進DevExtreme編輯器

限制 xca view ext ecb jquery tex res list DevExpress即將發布v17.2版本,在DevExtreme v17.2中,DevExtreme編輯器進行了一些改進。 除了dxScheduler,dxDataGrid,dxTreeLis

【DevExpress v17.2功能預告】DevExpress ASP.NET Scheduler的自適應功能

headers asp 空間 col 放置 如何 網站 image sources 自適應Web設計可以幫助您解決各種尺寸的屏幕問題,網站的自適應網頁設計可幫助您解決用戶使用不同大小屏幕顯示數據的問題。 在v17.2中,我們最大化了ASP.NET Scheduler的視圖和

Unity 2018.2 功能(XR相關)

概述 Unity 2018版本週期將圍繞Scriptable Render Pipeline (SRP)、Shader Graph、C# Job System、Entity Component System、Burst Compiler等核心功能展開,2018.2即在此基礎上新增新的功

elasticsearch 全文檢索,geo地理位置附近的人查詢

            elasticsearch 5.0.1  單機 cpu 8g記憶體     100萬資料量,搜尋耗時30ms 左右         ** * 實現附近的人功能,最大限額1000人,1米到100米範圍內的人 */ public class ES

Kubernetes 1.2 功能介紹:DaemonSet

如果您正在使用kubernetes構建你的生產環境,如果您正在尋找如何在每臺計算節點上執行一個守護程序(Pod),恭喜您, 什麼是DaemonSet DaemonSet能夠讓所有(或者一些特定)的Node節點運行同一個pod。當節點加入到kubernetes叢集中,

DevExpress ASP.NET Bootstrap Controls v18.2功能詳解(一)

訪問 文件管理 dropbox .net ots 二次 pen 工具 web 行業領先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式發布,本站將以連載的形式為大家介紹新版本新功能。本文將介紹了DevExpres

redis geo 地理位置系應用戰案例

兩個 usb des long tor ember pos tar 最大 專有名詞geographic 地理radius 半徑範圍; 半徑(距離); 用半徑度量的圓形面積 redis GEO實現 redis GEO實現主要包含了以下兩項技術: 1、使用geoha

Delphi RAD Studio 10.2.3中的功能:FireMonkey用戶界面模板

ads 分享 mon wid ack 風格 gpo 技術分享 monk 新版的ide中包含了移動端的18個模板,增強了用戶體驗,並讓開發更加快捷。 界面如下:                 (1)登錄模板截圖                (2)定制Jet iOS風格

51CTO博客2.0功能上線,快來跟我一起用一句話介紹自己

博客 proc HR BE cdc TP image pro 功能 在今天這個萬眾矚目世界杯,人人等待端午節的日子裏,我們51CTO博客2.0終於又迎來了一次版本更新。 現在大家跟我一起使用本次更新的新功能,用一句話介紹自己吧!! Q:一句話簡介可以在那兒被看到?

Spring Boot 2.x 小功能 – Spring Data Web configuration

Spring Boot 2.x 小新功能 – Spring Data Web configuration 摘要: 原創出處 www.bysocket.com 「泥瓦匠BYSocket 」歡迎轉載,保留摘要,謝謝! 不賺錢,是一個創業者的最大恥辱。先賺錢,活得好,再談發展,這才是最重要的

地理位置geo處理之mysql函式

目前越來越多的業務都會基於LBS,附近的人,外賣位置,附近商家等等,現就討論離我最近這一業務場景的解決方案。 原文:https://www.jianshu.com/p/455d0468f6d4 目前已知解決方案有: mysql 自定義函式計算

昆石VOS2009/VOS3000 2.1.6.00 功能介紹目錄

使用CentOS 5.X—CentOS 6.X 64位系統安裝 因為VOS3000和VOS2009的使用方法都是一樣的,所以就一起寫了認真看哦!!需要具體文件可以找博主要。 需要安裝VOS2009/VOS3000 2.1.6.0.0、VOS2009/VOS3000 2.1.4.0、呼叫中心、

藍芽BLE V4.2, V5 功能介紹

注:此文摘抄自 http://www.sunyouqun.com/category/ble-stack/ 協議釋出時間 協議版本 2016/12 Bluetooth 5 20

PHP 5.2、5.3、5.4、5.5、5.6 各版本功能詳解

總結 PHP5.2 以前:autoload, PDO 和 MySQLi, 型別約束 PHP5.2:JSON 支援 PHP5.3:棄用的功能,匿名函式,新增魔術方法,名稱空間,後期靜態繫結,Heredo

AngularJS進階 二十 HTML5實現獲取地理位置資訊並定位功能

HTML5實現獲取地理位置資訊並定位功能 注:請點選此處進行充電! 前言      這篇文章主要介紹了HTML5實現獲取地理位置資訊並定位功能,本文講解了原生HTML5、百度地圖、谷歌地圖等三種獲取理位置資訊並定位的方法,需要的朋友可以參考下。 H

Enscape 2.4功能預覽

作者-May Cheng 剛剛度過了雙11 大家的錢包都還好吧? 那麼靜下心來好好學習吧 學好Enscape 媽媽再也不用擔心我的賬單啦~ 2018年11月9號 EN官方釋出了Enscape最新版本:2.4.0 首先一起來看看,官方新功能視訊介紹 點選本行文字

ASP.NET Core 2.0 功能彙總

前言 ASP.NET Core 的變化和發展速度是飛快的,當你發現你還沒有掌握 ASP.NET Core 1.0 的時候, 2.0 已經快要釋出了,目前 2.0 處於 Preview 1 版本,意味著功能已經基本確定,還沒有學習過 ASP.NET Core 的同學可以直接從 2.0 開始學起,但是如果你已經

PHP7+REDIS3.2 phpredis scan命令 遊標問題

redis 中匹配某些key的方法一般有keys和scan兩種方式,但是鑑於直接在線上執行keys操作可能會造成Redis卡死等問題,所以想看有哪些keys,只能使用scan來操作了。在Redis命令列下操作沒啥問題:SCAN 遊標 MATCH 模式 COUNT每次執行都會返回當前遍歷到了哪個槽位和是否找到了