qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          由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ù)庫

          <2014年1月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 荆门市| 上林县| 博罗县| 沭阳县| 镇沅| 正安县| 杭锦后旗| 乌拉特前旗| 陕西省| 车致| 清徐县| 鄄城县| 武定县| 翼城县| 蒙自县| 屯昌县| 翁源县| 诏安县| 泰兴市| 保德县| 离岛区| 桃江县| 虎林市| 石嘴山市| 德昌县| 大洼县| 双桥区| 突泉县| 新丰县| 台南县| 招远市| 曲松县| 张家川| 梅河口市| 肥城市| 简阳市| 西和县| 江山市| 花垣县| 浠水县| 远安县|