本發(fā)明涉及信息技術(shù)處理領(lǐng)域,尤其涉及一種地理位置服務(wù)方法、服務(wù)器和系統(tǒng)。
背景技術(shù):
:地址位置服務(wù)(LocationBasedService,LBS),通常是基于支持地理位置空間索引的數(shù)據(jù)庫(如MongoDB、PostGIS)構(gòu)建的地址位置數(shù)據(jù)索引和查詢服務(wù)。當(dāng)由于不可預(yù)見的突發(fā)事件導(dǎo)致一定地理位置區(qū)域迅速成為熱點(diǎn)并由此帶來短時(shí)間內(nèi)大量數(shù)據(jù)索引和查詢請求時(shí),由于過度依賴數(shù)據(jù)庫來執(zhí)行索引和查詢,數(shù)據(jù)庫很容易成為整個(gè)服務(wù)的瓶頸,引起服務(wù)質(zhì)量下降。同時(shí)一旦數(shù)據(jù)庫出現(xiàn)問題無法訪問,會直接導(dǎo)致服務(wù)不可用。在一些軟件的應(yīng)用場景中就會經(jīng)常出現(xiàn)暴增的LBS查詢和寫入,比如下班高峰期時(shí)期大量用戶聚集核心商業(yè)區(qū)在約車軟件上約車,或者午餐時(shí)間集中在外賣軟件上點(diǎn)外賣,即在人群聚集區(qū)域短時(shí)間內(nèi)有較多人使用LBS服務(wù)時(shí)都會使這些區(qū)域成為熱點(diǎn)區(qū)域。而這些暴增的LBS查詢和寫入通常會導(dǎo)致數(shù)據(jù)庫的查詢性能急劇降低,查詢耗時(shí)增加,查詢吞吐量大幅降低,服務(wù)器CPU負(fù)載急劇上升,數(shù)據(jù)庫主從復(fù)制出現(xiàn)較大延遲的現(xiàn)象?,F(xiàn)有的解決方案是根據(jù)經(jīng)緯度進(jìn)行分區(qū),并為每個(gè)分區(qū)建立數(shù)據(jù)庫集群。通過這種將數(shù)據(jù)進(jìn)行分區(qū)存儲的方式,把索引和查詢分散到多個(gè)存儲集群來緩解上述問題。這種分區(qū)解決方案雖然能在一定程度上緩解問題,但并沒有從根本上解決熱點(diǎn)訪問暴增所帶來的問題。在任一個(gè)分區(qū)內(nèi)出現(xiàn)熱點(diǎn)訪問,索引和查詢量暴增時(shí)依然不可避免地出現(xiàn)上述問題,導(dǎo)致在同一分區(qū)內(nèi)的查詢服務(wù)質(zhì)量下降。技術(shù)實(shí)現(xiàn)要素:為此,本發(fā)明提供一種地理位置服務(wù)方法、服務(wù)器和系統(tǒng),以力圖解決或至少緩解上面存在的問題。根據(jù)本發(fā)明的一個(gè)方面,提供一種地理位置服務(wù)方法,適于在服務(wù)器中執(zhí)行,該方法包括:接收用戶的與地理位置有關(guān)的數(shù)據(jù)查詢請求,該數(shù)據(jù)查詢請求中包含有用戶的當(dāng)前地理位置信息;以用戶的當(dāng)前地理位置為中心、第一距離為半徑設(shè)置一圓形區(qū)域;根據(jù)地理空間索引庫檢索圓形區(qū)域內(nèi)覆蓋的所有地理空間單元的單元標(biāo)識;以檢索到的單元標(biāo)識作為關(guān)鍵詞在分布式高速緩存中搜索匹配的數(shù)據(jù),其中該分布式高速緩存中的數(shù)據(jù)是與單元標(biāo)識關(guān)聯(lián)存儲的;如果未從該分布式高速緩存中搜索到與單元標(biāo)識匹配的數(shù)據(jù),則將所有未匹配成功的單元標(biāo)識分別作為關(guān)鍵詞在數(shù)據(jù)庫中搜索匹配的數(shù)據(jù);根據(jù)用戶的查詢請求中包含的條件將從分布式高速緩存中搜索到的數(shù)據(jù)和從數(shù)據(jù)庫中搜索到的數(shù)據(jù)依次進(jìn)行合并、過濾及排序處理;向用戶返回包含處理后的數(shù)據(jù)的查詢結(jié)果。可選地,在根據(jù)本發(fā)明的方法中,地理空間索引庫包括GoogleS2Library或Geohash工具庫??蛇x地,在根據(jù)本發(fā)明的方法中,當(dāng)?shù)乩砜臻g索引庫采用GoogleS2Library工具庫時(shí),地理空間單元適于采用第15級的面積大小??蛇x地,在根據(jù)本發(fā)明的方法中,數(shù)據(jù)庫適于采用MongoDB數(shù)據(jù)庫,所述分布式高速緩存適于采用Memcache內(nèi)存緩存系統(tǒng)。可選地,在根據(jù)本發(fā)明的方法中,將所有未匹配成功的單元標(biāo)識分別作為關(guān)鍵詞在數(shù)據(jù)庫中搜索匹配的數(shù)據(jù)的步驟包括:計(jì)算每個(gè)單元標(biāo)識所對應(yīng)的地理空間單元的頂點(diǎn)經(jīng)緯度;根據(jù)該頂點(diǎn)經(jīng)緯度信息在MongoDB數(shù)據(jù)庫中通過執(zhí)行多邊形查詢的方法搜索匹配對應(yīng)的數(shù)據(jù)??蛇x地,在根據(jù)本發(fā)明的方法中,還包括:如果經(jīng)過處理后的數(shù)據(jù)總量未達(dá)到第一數(shù)值,則繼續(xù)在數(shù)據(jù)庫中搜索圓形區(qū)域內(nèi)覆蓋的所有地理空間單元之外的數(shù)據(jù),直至數(shù)據(jù)總量達(dá)到第一數(shù)值??蛇x地,在根據(jù)本發(fā)明的方法中,還包括:將以所有未匹配成功的單元標(biāo)識分別作為關(guān)鍵詞在數(shù)據(jù)庫中搜索到的數(shù)據(jù)及其對應(yīng)的單元標(biāo)識關(guān)聯(lián)存儲到分布式高速緩存中。可選地,在根據(jù)本發(fā)明的方法中,還包括:接收用戶的與地理位置有關(guān)的數(shù)據(jù)寫入請求,所述數(shù)據(jù)寫入請求中包含有用戶的當(dāng)前地理位置信息和待寫入的數(shù)據(jù);根據(jù)地理空間索引庫檢索用戶的當(dāng)前地理位置所屬的地理空間單元的單元標(biāo)識;將所述待寫入的數(shù)據(jù)發(fā)送至消息隊(duì)列中進(jìn)行中轉(zhuǎn)處理;判斷分布式高速緩存中是否存儲有所述根據(jù)數(shù)據(jù)寫入請求檢索到的單元標(biāo)識;若是則將所述經(jīng)過中轉(zhuǎn)處理后的數(shù)據(jù)同時(shí)發(fā)送至數(shù)據(jù)庫和分布式高速緩存中進(jìn)行存儲;否則只發(fā)送至數(shù)據(jù)庫中進(jìn)行存儲。根據(jù)本發(fā)明的另一個(gè)方面,提供一種服務(wù)器,包括:請求接收單元,適于接收用戶的數(shù)據(jù)查詢請求,該數(shù)據(jù)查詢請求中包含有用戶的當(dāng)前地理位置信息;區(qū)域設(shè)定單元,適于以用戶的當(dāng)前地理位置為中心、第一距離為半徑設(shè)置一圓形區(qū)域;標(biāo)識檢索單元,適于根據(jù)地理空間索引庫檢索圓形區(qū)域內(nèi)覆蓋的所有地理空間單元的單元標(biāo)識;第一獲取單元,適于以檢索到的單元標(biāo)識作為關(guān)鍵詞在分布式高速緩存中搜索匹配的數(shù)據(jù),其中該分布式高速緩存中的數(shù)據(jù)是與單元標(biāo)識關(guān)聯(lián)存儲的;第二獲取單元,適于當(dāng)未從分布式高速緩存中搜索到與單元標(biāo)識匹配的數(shù)據(jù)時(shí),將所有未匹配成功的單元標(biāo)識分別作為關(guān)鍵詞在數(shù)據(jù)庫中搜索匹配的數(shù)據(jù);數(shù)據(jù)處理單元,適于根據(jù)用戶的查詢請求中包含的條件將從分布式高速緩存中搜索到的數(shù)據(jù)和從數(shù)據(jù)庫中搜索到的數(shù)據(jù)依次進(jìn)行合并、過濾及排序處理;結(jié)果返回單元,適于向用戶返回包含處理后的數(shù)據(jù)的查詢結(jié)果??蛇x地,在根據(jù)本發(fā)明的服務(wù)器中,地理空間索引庫包括GoogleS2Library或Geohash工具庫??蛇x地,在根據(jù)本發(fā)明的服務(wù)器中,當(dāng)?shù)乩砜臻g索引庫采用所述GoogleS2Library工具庫時(shí),地理空間單元適于采用第15級的面積大小??蛇x地,在根據(jù)本發(fā)明的服務(wù)器中,數(shù)據(jù)庫適于采用MongoDB數(shù)據(jù)庫,分布式高速緩存適于采用Memcache內(nèi)存緩存系統(tǒng)。可選地,在根據(jù)本發(fā)明的服務(wù)器中,第二獲取單元適于根據(jù)以下方法根據(jù)未匹配成功的單元標(biāo)識在數(shù)據(jù)庫中搜索匹配的數(shù)據(jù):計(jì)算每個(gè)單元標(biāo)識所對應(yīng)的地理空間單元的頂點(diǎn)經(jīng)緯度;根據(jù)該頂點(diǎn)經(jīng)緯度信息在MongoDB數(shù)據(jù)庫中通過執(zhí)行多邊形查詢的方法搜索匹配的數(shù)據(jù)??蛇x地,在根據(jù)本發(fā)明的服務(wù)器中,還包括:數(shù)據(jù)補(bǔ)充單元,適于當(dāng)所述經(jīng)過處理后的數(shù)據(jù)總量未達(dá)到第一數(shù)值時(shí),繼續(xù)在數(shù)據(jù)庫中搜索圓形區(qū)域內(nèi)覆蓋的所有地理空間單元之外的數(shù)據(jù),直至數(shù)據(jù)總量達(dá)到第一數(shù)值??蛇x地,在根據(jù)本發(fā)明的服務(wù)器中,還包括:數(shù)據(jù)存儲單元,適于將以所有未匹配成功的單元標(biāo)識分別作為關(guān)鍵詞在數(shù)據(jù)庫中搜索到的數(shù)據(jù)及其對應(yīng)的單元標(biāo)識關(guān)聯(lián)存儲到分布式高速緩存中??蛇x地,在根據(jù)本發(fā)明的服務(wù)器中,請求接收單元還適于接收用戶的與地理位置有關(guān)的數(shù)據(jù)寫入請求,該數(shù)據(jù)寫入請求中包含用戶的當(dāng)前地理位置信息和待寫入的數(shù)據(jù);標(biāo)識檢索單元還適于根據(jù)地理空間索引庫檢索用戶的當(dāng)前地理位置所屬的地理空間單元的單元標(biāo)識。可選地,在根據(jù)本發(fā)明的服務(wù)器中,還包括:數(shù)據(jù)中轉(zhuǎn)單元,適于將待寫入的數(shù)據(jù)發(fā)送至消息隊(duì)列中進(jìn)行中轉(zhuǎn)處理??蛇x地,在根據(jù)本發(fā)明的服務(wù)器中,數(shù)據(jù)存儲單元還適于判斷分布式高速緩存中是否存儲有根據(jù)數(shù)據(jù)寫入請求檢索到的單元標(biāo)識;若是則將經(jīng)過中轉(zhuǎn)處理后的數(shù)據(jù)同時(shí)發(fā)送至數(shù)據(jù)庫和分布式高速緩存中進(jìn)行存儲;否則只發(fā)送至數(shù)據(jù)庫中進(jìn)行存儲。根據(jù)本發(fā)明的另一個(gè)方面,提供一種地理位置服務(wù)系統(tǒng),包括如上所述的服務(wù)器和至少一個(gè)移動終端。根據(jù)本發(fā)明提供的技術(shù)方案,根據(jù)GoogleS2Libarary工具庫將地理空間劃分為多個(gè)地理空間單元,每個(gè)地理空間單元都有其對應(yīng)的單元標(biāo)識,并在分布式高速緩存中將與地理位置有關(guān)的數(shù)據(jù)及該位置所述的單元標(biāo)識進(jìn)行關(guān)聯(lián)存儲。當(dāng)基于某一熱點(diǎn)位置發(fā)生海量查詢請求時(shí),優(yōu)先從分布式高速緩存中搜索當(dāng)前位置500m范圍內(nèi)的匹配數(shù)據(jù),以此支撐熱點(diǎn)位置的從而解決數(shù)據(jù)查詢對數(shù)據(jù)庫的強(qiáng)依賴問題。若某一位置的單元標(biāo)識在分布式高速緩存未命中對應(yīng)匹配的數(shù)據(jù),則從數(shù)據(jù)庫中搜索數(shù)據(jù),并采取WriteAnyway策略將從數(shù)據(jù)庫中獲取到的數(shù)據(jù)存儲到分布式高速緩存中。而對于海量數(shù)據(jù)寫入對數(shù)據(jù)庫造成的壓力,則通過增加消息隊(duì)列來緩解,寫入請求中所包含的數(shù)據(jù)首先發(fā)送至消息隊(duì)列,然后由隊(duì)列處理機(jī)從消息隊(duì)列中取出數(shù)據(jù)并處理。此外,在處理隊(duì)列消息更新存儲時(shí)對分布式高速緩存和數(shù)據(jù)庫雙寫以保證內(nèi)存緩存和數(shù)據(jù)庫的一致性。附圖說明為了實(shí)現(xiàn)上述以及相關(guān)目的,本文結(jié)合下面的描述和附圖來描述某些說明性方面,這些方面指示了可以實(shí)踐本文所公開的原理的各種方式,并且所有方面及其等效方面旨在落入所要求保護(hù)的主題的范圍內(nèi)。通過結(jié)合附圖閱讀下面的詳細(xì)描述,本公開的上述以及其它目的、特征和優(yōu)勢將變得更加明顯。遍及本公開,相同的附圖標(biāo)記通常指代相同的部件或元素。圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的地理位置服務(wù)系統(tǒng)100的示意圖;圖2示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的地理位置服務(wù)方法200的流程圖;圖3示出了根據(jù)GoogleS2Library中第14級的地理空間單元示意圖;圖4示出了根據(jù)GoogleS2Library中第15級的地理空間單元示意圖;圖5示出了根據(jù)GoogleS2Library中第16級的地理空間單元示意圖;圖6示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的地理位置服務(wù)方法600的流程圖;圖7示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的服務(wù)器700的結(jié)構(gòu)示意圖。具體實(shí)施方式下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的地理位置服務(wù)系統(tǒng)100的示意圖。如圖1所示,該系統(tǒng)一個(gè)服務(wù)器和至少一個(gè)智能終端。服務(wù)器可以是一臺服務(wù)器,也可以是由若干臺服務(wù)器組成的服務(wù)器集群,或者是一個(gè)云計(jì)算服務(wù)中心。此外,用于組成服務(wù)器集群或云計(jì)算服務(wù)中心的多個(gè)服務(wù)器可以駐留在多個(gè)地理位置中,本發(fā)明對服務(wù)器的部署方式不做限制。智能終端可以是可連網(wǎng)的車載導(dǎo)航,手機(jī)、平板電腦等移動設(shè)備,也可以是智能手表、智能眼鏡等可以連網(wǎng)的可穿戴設(shè)備。雖然圖1中僅示例性地示出了一個(gè)智能終端,但是本領(lǐng)域技術(shù)人員可以意識到,該系統(tǒng)中還可以包括多個(gè)智能終端,本發(fā)明對地理位置服務(wù)系統(tǒng)中的智能終端的數(shù)目并無限制。智能終端可以以有線或無線的方式與導(dǎo)航服務(wù)器建立連接。當(dāng)然,在大多數(shù)導(dǎo)航情境中,智能終端與導(dǎo)航服務(wù)器建立的是無線連接,例如,采用3G、4G、WiFi、個(gè)人熱點(diǎn)、IEEE802.11x、藍(lán)牙等技術(shù)建立無線連接。服務(wù)器向智能終端提供與地理位置相關(guān)的服務(wù),如響應(yīng)于用戶在美圖公司(經(jīng)緯度(24.492143,118.175379))提交的查詢附近500米內(nèi)的美拍視頻,向用戶返回查詢結(jié)果。此外,還可以通過多種途徑接收用戶上傳的與地理位置相關(guān)的數(shù)據(jù),如接收用戶在某一位置上傳的美拍視頻、微博和帖子,這些數(shù)據(jù)通常都帶有用戶的當(dāng)前地理位置信息,如經(jīng)緯度信息等。圖2示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的基于熱點(diǎn)訪問的地理位置服務(wù)方法200的流程圖,該方法始于步驟S210。在步驟S210中,接收用戶的與地理位置有關(guān)的數(shù)據(jù)查詢請求,所述數(shù)據(jù)查詢請求中包含有用戶的當(dāng)前地理位置信息。隨后,在步驟S220中,以用戶的當(dāng)前地理位置為中心、第一距離為半徑設(shè)置一圓形區(qū)域。基于地理位置的服務(wù),通常附近500m內(nèi)的數(shù)據(jù)對用戶而言更有意義,如附近500m內(nèi)的專車、飯店等,因此第一距離可以設(shè)定為500m,當(dāng)然也可以根據(jù)實(shí)際情況設(shè)置為其他數(shù)值。隨后,在步驟S230中,根據(jù)地理空間索引庫檢索所述圓形區(qū)域內(nèi)覆蓋的所有地理空間單元的單元標(biāo)識。其中,圓形區(qū)域內(nèi)覆蓋的所有地理空間單元可參見圖3中的所示的所有四邊形格子單元。如上所述的地理空間索引庫可以采用GoogleS2Library或GeoHash工具庫,不同的是前者基于球面模型而后者基于平面模型。以GoogleS2Library為例,它將地球的球面根據(jù)等級規(guī)則分割成小的地理空間單元(Cell),每個(gè)單元都有其唯一的ID編號,可以稱之為CellID。實(shí)際上,地球上每一平方厘米的面積都可以用一個(gè)唯一CellID來表示,將CellID轉(zhuǎn)換成16進(jìn)制編碼即為該地理空間單元的單元標(biāo)識(CellToken),以單元標(biāo)識為關(guān)鍵詞可以在分布式高速緩存或數(shù)據(jù)庫中搜索到匹配該單元標(biāo)識所屬的地理空間單元的數(shù)據(jù)。每個(gè)單元的大小和形狀也不完全相同,這通常取決于該單元在地球上的位置。地理空間單元的等級及其所表示的單元面積大小關(guān)系如下表所示:等級最小面積最大面積085,011,012km285,011,012km2121,252,753km221,252,753km2123.31km26.38km2300.48cm20.93cm2通過GoogleS2Library可以計(jì)算出覆蓋一個(gè)特定形狀所需要的單元。若設(shè)定查詢附近500m內(nèi)的數(shù)據(jù),則我們需要確定覆蓋用戶當(dāng)前的地理位置為中心、以500米為半徑的圓形區(qū)域,所需的相同等級的地理空間單元及單元覆蓋面積。圖3-5分別示出了GoogleS2Library中第14級、15級、16級的地理空間單元示意圖,其中的圓形區(qū)域即為覆蓋附近500m的區(qū)域范圍。發(fā)明人根據(jù)大量實(shí)際測試發(fā)現(xiàn),14級的地理空間單元覆蓋面積較大,導(dǎo)致用戶在查詢時(shí)得到較多500m范圍之外的無關(guān)數(shù)據(jù);16級的地理空間單元覆蓋面積又過小,則覆蓋500米的圓形區(qū)域需要更多的地理空間單元,增加了緩存查詢的工作量。因此,發(fā)明人綜合考慮覆蓋特定區(qū)域所需要的單元數(shù)以及每個(gè)單元所覆蓋的區(qū)域面積,選擇15級的地理空間單元以獲得較好的用戶體驗(yàn)。計(jì)算一個(gè)地理位置所屬的15級地理單元的單元標(biāo)識,可以通過如下方法調(diào)用得出:publicStringgetCellToken(doublelongitude,doublelatitude){S2Cellcell=newS2Cell(S2LatLng.fromDegrees(latitude,longitude));returncell.id().parent(15).toToken();}以美圖公司所在經(jīng)緯度(24.4921434999,118.1753793695)為例,其所在15級地理空間單元的ID為3752794007428661248,轉(zhuǎn)換為16進(jìn)制得到單元標(biāo)識Token為34149a444,根據(jù)這個(gè)單元標(biāo)識即可在分布式高速緩存或數(shù)據(jù)庫中搜索到美圖公司所在地理空間單元的與位置有關(guān)的數(shù)據(jù)。若用戶在美圖公司附近請求查詢附近的視頻美拍,服務(wù)器接收該請求后,首先通過GoogleS2Library計(jì)算出覆蓋該地理位置500米內(nèi)的所有地理空間單元的單元標(biāo)識,當(dāng)然也可以根據(jù)實(shí)際情況調(diào)整半徑大小。其中,計(jì)算覆蓋以指定經(jīng)緯度為中心,500米為半徑的所有地理空間單元標(biāo)識,可通過以下方法得出(Java):在上述例子中,覆蓋美圖公司附近500m圓形區(qū)域的所有地理空間單元標(biāo)識為:"34149a40c","34149a414","34149a434","34149a43c","34149a444","34149a44c","34149a454","34149a45c","34149a464","34149a46c","34149a474","34149a47c","34149a48c","34149a4f4","34149a4fc","34149a5ac","34149a5b4",共17個(gè),分別對應(yīng)圖4中所示的17個(gè)四邊形單元。隨后,在步驟S240中,以檢索到的單元標(biāo)識作為關(guān)鍵詞在分布式高速緩存中搜索匹配的數(shù)據(jù),其中該分布式高速緩存中的數(shù)據(jù)是與單元標(biāo)識關(guān)聯(lián)存儲的。具體地,分布式高速緩存可以采用Memcache內(nèi)存緩存系統(tǒng),在搜索數(shù)據(jù)時(shí)可以通過Memcache的MultiGet并發(fā)獲取內(nèi)存緩存中所存儲的每個(gè)地理空間單元內(nèi)的數(shù)據(jù)。隨后,在步驟S250中,如果未從該分布式高速緩存中搜索到與單元標(biāo)識匹配的數(shù)據(jù),則將所有未匹配成功的單元標(biāo)識分別作為關(guān)鍵詞在數(shù)據(jù)庫中搜索匹配的數(shù)據(jù)。另外還可以將上述以所有未匹配成功的單元標(biāo)識分別作為關(guān)鍵詞在數(shù)據(jù)庫中搜索到的數(shù)據(jù)及其對應(yīng)的單元標(biāo)識關(guān)聯(lián)存儲到分布式高速緩存中。具體地,若在分布式高速緩存中未建立某單元標(biāo)識的分項(xiàng),則以該單元標(biāo)識為關(guān)鍵詞在數(shù)據(jù)庫中搜索匹配的數(shù)據(jù);即對所有在分布式高速緩存中未命中的單元標(biāo)識,直接從數(shù)據(jù)庫中獲取數(shù)據(jù)。此外,在從數(shù)據(jù)庫獲取數(shù)據(jù)時(shí)可以不參照用戶的查詢條件,獲取與這個(gè)單元標(biāo)識相關(guān)的所有數(shù)據(jù),并采用WriteAnyway的數(shù)據(jù)緩存寫策略在分布式高速緩存中將從數(shù)據(jù)庫中獲取到的數(shù)據(jù)及其對應(yīng)的單元標(biāo)識關(guān)聯(lián)存儲。如用戶在美圖公司需要查詢附近的美拍,但在分布式高速緩存中并未存儲美圖所在的"34149a444"單元標(biāo)識及其對應(yīng)的數(shù)據(jù)。此時(shí)可以在數(shù)據(jù)庫中以"34149a444"單元標(biāo)識為關(guān)鍵詞搜索所對應(yīng)的數(shù)據(jù),在這里就不限定為美拍類數(shù)據(jù),而是所有與該單元標(biāo)識相關(guān)的數(shù)據(jù),如該地理空間單元內(nèi)的微博、帖子、專車信息、飯店等,并將這些獲取到的所有數(shù)據(jù)及其對應(yīng)的"34149a444"單元標(biāo)識在分布式告訴緩存中關(guān)聯(lián)存儲。如上所述的數(shù)據(jù)庫可以采用MongoDB數(shù)據(jù)庫,為在緩存穿透時(shí)從MongoDB數(shù)據(jù)庫中準(zhǔn)確讀取一個(gè)地理空間單元內(nèi)的數(shù)據(jù),采用先計(jì)算該單元的頂點(diǎn)經(jīng)緯度,然后在MongoDB中執(zhí)行多邊形查詢來實(shí)現(xiàn)。具體地,可以通過如下方法計(jì)算地理空間單元頂點(diǎn)(Java):在<coordinates>中傳入通過GoogleS2Library計(jì)算得到的地理空間單元的頂點(diǎn)經(jīng)緯度數(shù)據(jù)即可。隨后,在步驟S260中,根據(jù)用戶的查詢請求中包含的條件將從分布式高速緩存中搜索到的數(shù)據(jù)和從數(shù)據(jù)庫中搜索到的數(shù)據(jù)依次進(jìn)行合并、過濾及排序處理。隨后,在步驟S270中,向用戶返回包含處理后的數(shù)據(jù)的查詢結(jié)果。具體地,可以先判定上述經(jīng)過處理后的數(shù)據(jù)總量是否達(dá)到第一數(shù)值,如是否能夠取滿一頁。若是則直接向用戶返回查詢結(jié)果;否則繼續(xù)在數(shù)據(jù)庫中搜索圓形區(qū)域內(nèi)覆蓋的所有地理空間單元之外的數(shù)據(jù),直至數(shù)據(jù)總量達(dá)到第一數(shù)值,并向用戶返回包含有已滿足第一數(shù)值的數(shù)據(jù)的查詢結(jié)果。這里,因?yàn)閮?yōu)先處理的是500m范圍內(nèi)的數(shù)據(jù),所以后續(xù)從500m范圍外補(bǔ)充的數(shù)據(jù)可以直接在附在原有數(shù)據(jù)之后返回給用戶,當(dāng)然也可以對這些補(bǔ)充的數(shù)據(jù)進(jìn)行一定的過濾及排序處理,本發(fā)明對此不作限制。MongoDB數(shù)據(jù)庫可以通過如下的查詢語法讀取500米外的數(shù)據(jù):其中,<pointcoordinates>中指定用戶當(dāng)前位置,<minDistance>中指定最小距離,500米外首次查詢時(shí)設(shè)定為500,非首次查詢時(shí)<minDistance>值設(shè)定為上頁結(jié)果中的最小值。需要說明的是,某些情況下用戶會直接設(shè)定需要查找附近一定距離內(nèi)的的數(shù)據(jù),如1km、2km或5km等,此時(shí)為降低查詢工作量,對于500m的數(shù)據(jù)可以采用上述方案,500m外的數(shù)據(jù)則可以直接去數(shù)據(jù)庫中搜索,最終將這兩部分獲取到的數(shù)據(jù)進(jìn)行合并處理后返回給用戶。圖6示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的地理位置服務(wù)方法600的流程圖,該方法始于步驟S610。在步驟S610中,接收用戶的與地理位置有關(guān)的數(shù)據(jù)寫入請求,所述數(shù)據(jù)寫入請求中包含有用戶的當(dāng)前地理位置信息和待寫入的數(shù)據(jù)。以用戶上傳附近的美拍為例,用戶上傳美拍視頻的同時(shí),會帶上用戶的地理位置信息即用戶當(dāng)前所在的經(jīng)緯度,服務(wù)器需要將位置信息及該美拍視頻寫入到分布式高速緩存和數(shù)據(jù)庫中以供查詢。隨后,在步驟S620中,根據(jù)地理空間索引庫檢索用戶的當(dāng)前地理位置所屬的地理空間單元的單元標(biāo)識,具體檢索方法已在步驟S230中詳細(xì)說明。隨后,在步驟S630中,將待寫入的數(shù)據(jù)發(fā)送至消息隊(duì)列中進(jìn)行中轉(zhuǎn)處理。具體地,將待寫入的數(shù)據(jù)發(fā)送至消息隊(duì)列后,多個(gè)隊(duì)列處理機(jī)從消息隊(duì)列中讀取消息并進(jìn)行處理。隨后,在步驟S640中,判斷分布式高速緩存中是否存儲有所述根據(jù)數(shù)據(jù)寫入請求檢索到的單元標(biāo)識,若是則在步驟S650中將上述經(jīng)過中轉(zhuǎn)處理后的數(shù)據(jù)同時(shí)發(fā)送至數(shù)據(jù)庫和分布式高速緩存中進(jìn)行存儲;反之則在步驟S660中只發(fā)送至數(shù)據(jù)庫中進(jìn)行存儲。即采用WriteIfExisted的數(shù)據(jù)緩存寫策略,當(dāng)向分布式高速緩存中寫入數(shù)據(jù)時(shí),若緩存中未緩存當(dāng)前的單元標(biāo)識,則不將新提交的數(shù)據(jù)寫入緩存,以此避免在分布式高速緩存中存儲大量的冷數(shù)據(jù)(用戶根本沒有查詢過的數(shù)據(jù))占用內(nèi)存;高速緩存也會設(shè)置一定的過期時(shí)間,太久沒有被訪問就會被從高速緩存中清掉。其中,在將數(shù)據(jù)存儲入分布式高速緩存中時(shí),可先取出原數(shù)據(jù),并將新提交的數(shù)據(jù)變更合并進(jìn)去后進(jìn)行存儲。圖7示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的服務(wù)器700的結(jié)構(gòu)示意圖,該服務(wù)器包括:請求接收單元710、區(qū)域設(shè)定單元720、標(biāo)識檢索單元730、第一獲取單元740、第二獲取單元750、數(shù)據(jù)處理單元760和結(jié)果返回單元770。請求接收單元710適于接收用戶的數(shù)據(jù)查詢請求,該數(shù)據(jù)查詢請求中包含有用戶的當(dāng)前地理位置信息;還適于接收用戶的與地理位置有關(guān)的數(shù)據(jù)寫入請求,該數(shù)據(jù)寫入請求中包含用戶的當(dāng)前地理位置信息和待寫入的數(shù)據(jù)。區(qū)域設(shè)定單元720適于以用戶的當(dāng)前地理位置為中心、第一距離為半徑設(shè)置一圓形區(qū)域。標(biāo)識檢索單元730適于根據(jù)地理空間索引庫檢索圓形區(qū)域內(nèi)覆蓋的所有地理空間單元的單元標(biāo)識;還適于根據(jù)地理空間索引庫檢索用戶的當(dāng)前地理位置所屬的地理空間單元的單元標(biāo)識。其中地理空間索引庫可以采用GoogleS2Library或Geohash工具庫,當(dāng)采用GoogleS2Library工具庫時(shí),地理空間單元適于采用第15級的面積大小。第一獲取單元740適于以檢索到的單元標(biāo)識作為關(guān)鍵詞在分布式高速緩存中搜索匹配的數(shù)據(jù),其中該分布式高速緩存中的數(shù)據(jù)是與單元標(biāo)識關(guān)聯(lián)存儲的。第二獲取單元750適于當(dāng)未從分布式高速緩存中搜索到與單元標(biāo)識匹配的數(shù)據(jù)時(shí),將所有未匹配成功的單元標(biāo)識分別作為關(guān)鍵詞在數(shù)據(jù)庫中搜索匹配的數(shù)據(jù)。其中,數(shù)據(jù)庫可以采用MongoDB數(shù)據(jù)庫,分布式高速緩存可以采用Memcache內(nèi)存緩存系統(tǒng)。具體地,第二獲取單元在MongoDB數(shù)據(jù)庫中搜索數(shù)據(jù)時(shí),可以計(jì)算每個(gè)單元標(biāo)識所對應(yīng)的地理空間單元的頂點(diǎn)經(jīng)緯度;根據(jù)該頂點(diǎn)經(jīng)緯度信息在MongoDB數(shù)據(jù)庫中通過執(zhí)行多邊形查詢的方法搜索匹配的數(shù)據(jù)。數(shù)據(jù)處理單元760適于根據(jù)用戶的查詢請求中包含的條件將從分布式高速緩存中搜索到的數(shù)據(jù)和從數(shù)據(jù)庫中搜索到的數(shù)據(jù)依次進(jìn)行合并、過濾及排序處理。結(jié)果返回單元770適于向用戶返回包含處理后的數(shù)據(jù)的查詢結(jié)果。此外,根據(jù)本發(fā)明的服務(wù)器,還可以包括數(shù)據(jù)存儲單元、數(shù)據(jù)補(bǔ)充單元和數(shù)據(jù)中轉(zhuǎn)單元。數(shù)據(jù)補(bǔ)充單元適于當(dāng)經(jīng)過處理后的數(shù)據(jù)總量未達(dá)到第一數(shù)值時(shí),繼續(xù)在數(shù)據(jù)庫中搜索圓形區(qū)域內(nèi)覆蓋的所有地理空間單元之外的數(shù)據(jù),直至數(shù)據(jù)總量達(dá)到第一數(shù)值。數(shù)據(jù)中轉(zhuǎn)單元適于將待寫入的數(shù)據(jù)發(fā)送至消息隊(duì)列中進(jìn)行中轉(zhuǎn)處理。數(shù)據(jù)存儲單元適于將以所有未匹配成功的單元標(biāo)識分別作為關(guān)鍵詞在數(shù)據(jù)庫中搜索到的數(shù)據(jù)及其對應(yīng)的單元標(biāo)識關(guān)聯(lián)存儲到分布式高速緩存中;還適于判斷該分布式高速緩存中是否存儲有根據(jù)數(shù)據(jù)寫入請求檢索到的單元標(biāo)識;若是則將經(jīng)過中轉(zhuǎn)處理后的數(shù)據(jù)同時(shí)發(fā)送至數(shù)據(jù)庫和分布式高速緩存中進(jìn)行存儲;否則只發(fā)送至數(shù)據(jù)庫中進(jìn)行存儲。根據(jù)本發(fā)明的服務(wù)器,其具體細(xì)節(jié)已在基于圖1-6的描述中詳細(xì)公開,在此不再進(jìn)行贅述。根據(jù)本發(fā)明的技術(shù)方案,根據(jù)GoogleS2Libarary工具庫劃分為多個(gè)地理空間單元,并在分布式高速緩存中將每個(gè)地理空間單元內(nèi)與地理位置有關(guān)的數(shù)據(jù)及其對應(yīng)的單元標(biāo)識關(guān)聯(lián)存儲。對于內(nèi)存緩存已存儲的數(shù)據(jù)不需要再從數(shù)據(jù)庫中讀取,減輕數(shù)據(jù)庫的查詢壓力,解決了熱點(diǎn)區(qū)域的高并發(fā)讀取被數(shù)據(jù)庫的并發(fā)能力所制約的問題,同時(shí)內(nèi)存緩存也帶來更短的查詢耗時(shí)和更高的吞吐。此外,還通過消息隊(duì)列中轉(zhuǎn)寫操作,寫入請求首先進(jìn)入消息隊(duì)列,由隊(duì)列處理機(jī)從消息隊(duì)列中取出消息并處理,消除了對后端數(shù)據(jù)庫的較大峰值寫入,從而實(shí)現(xiàn)了保護(hù)后端數(shù)據(jù)庫的目的。B10、如B9所述的服務(wù)器,其中所述地理空間索引庫包括GoogleS2Library或Geohash工具庫。B11、如B10所述的服務(wù)器,當(dāng)所述地理空間索引庫采用所述GoogleS2Library工具庫時(shí),所述地理空間單元適于采用第15級的面積大小。B12、如B9所述的服務(wù)器,所述數(shù)據(jù)庫適于采用MongoDB數(shù)據(jù)庫,所述分布式高速緩存適于采用Memcache內(nèi)存緩存系統(tǒng)。B13、如B12所述的服務(wù)器,其中所述第二獲取單元適于根據(jù)以下方法根據(jù)未匹配成功的單元標(biāo)識在數(shù)據(jù)庫中搜索匹配的數(shù)據(jù):計(jì)算每個(gè)單元標(biāo)識所對應(yīng)的地理空間單元的頂點(diǎn)經(jīng)緯度;根據(jù)該頂點(diǎn)經(jīng)緯度信息在所述MongoDB數(shù)據(jù)庫中通過執(zhí)行多邊形查詢的方法搜索匹配的數(shù)據(jù)。B14、如B9所述的服務(wù)器,還包括:數(shù)據(jù)補(bǔ)充單元,適于當(dāng)所述經(jīng)過處理后的數(shù)據(jù)總量未達(dá)到第一數(shù)值時(shí),繼續(xù)在數(shù)據(jù)庫中搜索所述圓形區(qū)域內(nèi)覆蓋的所有地理空間單元之外的數(shù)據(jù),直至數(shù)據(jù)總量達(dá)到第一數(shù)值。B15、如B9所述的服務(wù)器,還包括:數(shù)據(jù)存儲單元,適于將所述以所有未匹配成功的單元標(biāo)識分別作為關(guān)鍵詞在數(shù)據(jù)庫中搜索到的數(shù)據(jù)及其對應(yīng)的單元標(biāo)識關(guān)聯(lián)存儲到分布式高速緩存中。B16、如B9所述的服務(wù)器,所述請求接收單元還適于接收用戶的與地理位置有關(guān)的數(shù)據(jù)寫入請求,所述數(shù)據(jù)寫入請求中包含用戶的當(dāng)前地理位置信息和待寫入的數(shù)據(jù);所述標(biāo)識檢索單元還適于根據(jù)地理空間索引庫檢索用戶的當(dāng)前地理位置所屬的地理空間單元的單元標(biāo)識。B17、如B15所述的服務(wù)器,還包括數(shù)據(jù)中轉(zhuǎn)單元,適于將所述待寫入的數(shù)據(jù)發(fā)送至消息隊(duì)列中進(jìn)行中轉(zhuǎn)處理。B18、如B17所述的服務(wù)器,所述數(shù)據(jù)存儲單元還適于判斷所述分布式高速緩存中是否存儲有所述根據(jù)數(shù)據(jù)寫入請求檢索到的單元標(biāo)識;若是則將所述經(jīng)過中轉(zhuǎn)處理后的數(shù)據(jù)同時(shí)發(fā)送至數(shù)據(jù)庫和分布式高速緩存中進(jìn)行存儲;否則只發(fā)送至數(shù)據(jù)庫中進(jìn)行存儲。在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒有這些具體細(xì)節(jié)的情況下被實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對本說明書的理解。類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。本領(lǐng)域那些技術(shù)人員應(yīng)當(dāng)理解在本文所公開的示例中的設(shè)備的模塊或單元或組件可以布置在如該實(shí)施例中所描述的設(shè)備中,或者可替換地可以定位在與該示例中的設(shè)備不同的一個(gè)或多個(gè)設(shè)備中。前述示例中的模塊可以組合為一個(gè)模塊或者此外可以分成多個(gè)子模塊。本領(lǐng)域那些技術(shù)人員可以理解,可以對實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們設(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中。可以把實(shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來代替。此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來使用。此外,所述實(shí)施例中的一些在此被描述成可以由計(jì)算機(jī)系統(tǒng)的處理器或者由執(zhí)行所述功能的其它裝置實(shí)施的方法或方法元素的組合。因此,具有用于實(shí)施所述方法或方法元素的必要指令的處理器形成用于實(shí)施該方法或方法元素的裝置。此外,裝置實(shí)施例的在此所述的元素是如下裝置的例子:該裝置用于實(shí)施由為了實(shí)施該發(fā)明的目的的元素所執(zhí)行的功能。如在此所使用的那樣,除非另行規(guī)定,使用序數(shù)詞“第一”、“第二”、“第三”等等來描述普通對象僅僅表示涉及類似對象的不同實(shí)例,并且并不意圖暗示這樣被描述的對象必須具有時(shí)間上、空間上、排序方面或者以任意其它方式的給定順序。盡管根據(jù)有限數(shù)量的實(shí)施例描述了本發(fā)明,但是受益于上面的描述,本
技術(shù)領(lǐng)域:
內(nèi)的技術(shù)人員明白,在由此描述的本發(fā)明的范圍內(nèi),可以設(shè)想其它實(shí)施例。此外,應(yīng)當(dāng)注意,本說明書中使用的語言主要是為了可讀性和教導(dǎo)的目的而選擇的,而不是為了解釋或者限定本發(fā)明的主題而選擇的。因此,在不偏離所附權(quán)利要求書的范圍和精神的情況下,對于本
技術(shù)領(lǐng)域:
的普通技術(shù)人員來說許多修改和變更都是顯而易見的。對于本發(fā)明的范圍,對本發(fā)明所做的公開是說明性的,而非限制性的,本發(fā)明的范圍由所附權(quán)利要求書限定。當(dāng)前第1頁1 2 3