由SQL數(shù)據(jù)庫轉(zhuǎn)換Redis的實(shí)例
深圳市的士查詢軟件(gogo查的后臺(tái)服務(wù)器)
1、現(xiàn)有版本總結(jié)
熱點(diǎn)區(qū)域信息是根據(jù)過去半年的歷史數(shù)據(jù)計(jì)算得出,短期內(nèi)屬于固定信息,不用做任何改變?,F(xiàn)在所用的gogo查的版本中,查詢熱點(diǎn)區(qū)域所用的API,是先在servlet中計(jì)算出用戶選擇區(qū)域周圍的區(qū)域ID,構(gòu)造出SQL查詢語句,最后從postgresql中讀取所需的熱點(diǎn)區(qū)域信息。
SQL語句如下:
Select regionno from sztable.hotregioninfo where dayofweek=’”+ dayofweek+”’ and hour = ‘”+hour+”’ and regionno in “+sBuilder.toString()+”order by amount desc limit ”+return_region_num+”; |
具體操作可在XGO API程序中看到。
數(shù)據(jù)庫中所存的熱點(diǎn)信息,共有800多W條,在SQL查詢中需要耗時(shí)至少2~3秒,查詢效率低下,導(dǎo)致用戶體驗(yàn)下降。故在此采用Redis解決查詢較慢的問題。
2、熱點(diǎn)區(qū)域postgresql轉(zhuǎn)Redis
Redis數(shù)據(jù)庫設(shè)計(jì):結(jié)合原有數(shù)據(jù)以及查詢需求(需要求周邊區(qū)域中前N大),采用Redis中有序集合的數(shù)據(jù)結(jié)構(gòu)。用“星期:時(shí)間”字符串作為key,共有(7*24=168)個(gè);用相應(yīng)區(qū)域號(hào)及在該區(qū)域成功打車的次數(shù)作為value中的memeber和score。
將熱點(diǎn)區(qū)域信息從postgresql中導(dǎo)入redis:程序代碼在PostToRedis中,ToRedis為程序入口。直接運(yùn)行即可將數(shù)據(jù)從postgresql中以1中設(shè)計(jì)格式導(dǎo)入redis。注:由于讀取數(shù)據(jù)量較大,可能會(huì)導(dǎo)致計(jì)算機(jī)為java分配的內(nèi)存空間不夠用,應(yīng)在運(yùn)行前進(jìn)行相應(yīng)設(shè)置(Xms)。
3、查詢過程
模擬用戶查詢操作,采用的模式為:用戶提交坐標(biāo)點(diǎn)及第幾天、時(shí)間,在serrvlet中計(jì)算出坐標(biāo)點(diǎn)所在區(qū)域號(hào),根據(jù)半徑計(jì)算出要查詢的范圍內(nèi)所有的區(qū)域ID,并寫入到Redis有序集合T1(臨時(shí),只對(duì)本次查詢有效,查詢結(jié)束之后即將該集合銷毀)中,然后將T1與之前已經(jīng)存好的168個(gè)key、value中相應(yīng)時(shí)間段的集合求交集。Eg:現(xiàn)在為周三,上午十點(diǎn)鐘,就與key為3:10的集合求交集,交集結(jié)果按照降序排列,將前N區(qū)域號(hào)提取出來,并根據(jù)將區(qū)域號(hào)轉(zhuǎn)為坐標(biāo)的算法得到輸出結(jié)果。
需要注意的是,每次查詢?cè)趓edis中新增加的key,在本次查詢結(jié)束之后都要進(jìn)行銷毀或者設(shè)置存活時(shí)間,使系統(tǒng)能夠較快的釋放掉該key所占用的內(nèi)存空間,減少累加查詢導(dǎo)致過多無效key存在,一定程度上緩解服務(wù)器壓力。
熱點(diǎn)區(qū)域查詢的API,在程序包HotRegionRedis中。
4、存在弊端
每次查詢都要向redis中寫入新的數(shù)據(jù)集合,雖然redis聲稱每秒中可支持10W次寫入操作,但在既有寫又有讀、高并發(fā)的情況下會(huì)導(dǎo)致Redis性能下降。不過在相當(dāng)一段時(shí)間內(nèi),這種模式可以滿足需求。
5、建議
建議之后將熱點(diǎn)區(qū)域中分區(qū)方法改進(jìn),結(jié)合Geohash算法。(由于要求前N大,暫時(shí)無法避免查詢操作時(shí)向Redis中寫入數(shù)據(jù))。
posted on 2014-01-10 09:34 順其自然EVO 閱讀(1436) 評(píng)論(0) 編輯 收藏 所屬分類: 數(shù)據(jù)庫