轉載於:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/144.html
移動互聯網增進了人與人之間的聯系,其中基於位置信息的服務(Location Based Service,LBS)起到很重要的促進作用。在移動互聯網的大環境下,每個手機都變成了一個位置追蹤設備,為人們提供了非常豐富的位置服務。無論是附近的人,還是搖一搖等耳熟能詳的應用都需要LBS在后台的支撐。但是,目前位置信息的使用過程中存在諸多挑戰如相鄰計算不准確等。由於經常面對海量數據請求,通常位置服務的計算都需要數據庫來完成,Redis Geo模塊因此而生,旨在提供精准而且穩定的位置服務。
在位置服務的挑戰中,常見的是計算兩個位置是否相鄰的問題。位置信息由一個四元組構成,(經度、緯度、海拔、時間),在使用過程中比較常用的是經緯度。想要進行相鄰計算,需要一個二維索引。問題是現有的基於簡單的一維索引和划范圍搜索實現的二維索引,基本只適用於整數查詢,並不適用於經緯度這種位置的相似度查詢。意識到了這個困難,且伴隨位置服務需求日益增長的情況,2008年Gustavo Niemeyer提出了 Geohash ,簡單來說是一個32位的編碼字符串來將位置能夠編碼整合成為可范圍查找的實體。由於大多數數據庫都支持范圍查詢,因此位置就變得可查找和計算。原始Geohash的缺點是查詢的准確度有時較低,后續開發者又創造了52位Geohash等來滿足定制化的需求。
NoSQL中,Mongodb對位置服務的 支持較好 ,穩定地支持了foursquare等應用。而HBase也曾推出 相關教程 支持在應用中引入位置服務。作為優秀NoSQL數據庫的典范,Redis在位置計算方面卻略顯薄弱。為此,意大利程序員Salvatore Sanfilippo(antirez@GitHub )維護了一個專門為Redis增加位置計算的分支。發布之后,獲得領域內的一致認可,短短幾個月收獲多達1萬3千余個星標。在 Hacker News 上,許多程序員也表示對Redis位置查詢的功能相見恨晚,大家積極討論了Redis Geo存在的必要性,以及后續應該從性能和查詢准確性上提升的若干手段,甚至有人進一步貢獻了Redis Geo的 Docker鏡像 。
更多關於Redis Geo的細節可以參考antirez給出的 文檔頁面 ,其中包括了Redis Geo的基本使用,例如添加經緯度、計算經緯度相似度、計算城市之間的包含關系等多種位置計算功能。antirez還進一步解釋了Redis Geo的工作原理,以及該模塊在Benchmark上運行的性能表現,每秒可達近5百萬次編解碼,能滿足大部分位置服務應用的需求。