頁(yè)面端數(shù)據(jù)cache的一種實(shí)現(xiàn)思路
今天在做項(xiàng)目的時(shí)候,遇到這樣一個(gè)需求,這個(gè)需求也比較常見(jiàn):在顯示的一組list版面,當(dāng)用戶(hù)鼠標(biāo)移動(dòng)到標(biāo)題的時(shí)候,出現(xiàn)tips提示,里面顯示當(dāng)前欄一些詳細(xì)信息。
難點(diǎn)如下:
1)由于list有多個(gè)標(biāo)題(比如20個(gè)),不可能在一個(gè)request中,把所有的詳細(xì)信息取出來(lái)put到頁(yè)面上。所以只能通過(guò)ajax異步請(qǐng)求的方式取的數(shù)據(jù)。
2)取詳細(xì)信息比較耗性能,需要走一次搜索引擎,走一次數(shù)據(jù)庫(kù)多表查詢(xún)進(jìn)行結(jié)果統(tǒng)計(jì)。雖然取的過(guò)程比較耗服務(wù)器性能,但是取的結(jié)果集對(duì)象是很小的。
3)單條詳細(xì)信息load次數(shù)只跟個(gè)別會(huì)員有關(guān),比如,只有a會(huì)員的list頁(yè)面需要load 標(biāo)題A的詳細(xì)信息,而且當(dāng)a用戶(hù)多次將鼠標(biāo)移到該標(biāo)題上,會(huì)多次load數(shù)據(jù)。反觀站點(diǎn)整體訪問(wèn)中,其他會(huì)員幾乎不用load 標(biāo)題A的信息。所以,把這些詳細(xì)信息放到全局cache中,比如memcached中,命中率也會(huì)很低。不值得。(放session就更別提了,session不是用來(lái)放這些數(shù)據(jù)的:比如某個(gè)集群環(huán)境中,是使用session復(fù)制的機(jī)制;比如session過(guò)期,短時(shí)間內(nèi)--甚至比較長(zhǎng)的時(shí)間內(nèi),session依舊存在內(nèi)存中,等等。。。)
那么如何來(lái)解決這個(gè)問(wèn)題呢?
正當(dāng)想說(shuō)服需求方放棄這個(gè)需求時(shí),出現(xiàn)了一個(gè)靈感,可以把數(shù)據(jù)cache在html頁(yè)面上。思路如下:
1、在html頁(yè)面上放n個(gè)input元素:<input id="list1" type="hidden" value="" />。視為cache對(duì)象;
2、首次取詳細(xì)信息,通過(guò)ajax異步訪問(wèn)服務(wù)端,將得到的數(shù)據(jù)存放到相應(yīng)的input元素中,并且在指定的div上顯示詳細(xì)信息;
3、之后,取同內(nèi)容的詳細(xì)信息,只要從相應(yīng)的input元素中取得即可,并顯示在指定的div上。
通過(guò)這樣處理,可以避免用戶(hù)多次向服務(wù)端取相同的信息。當(dāng)然這樣處理,不能防止惡意用戶(hù)的訪問(wèn),但是能滿(mǎn)足80%用戶(hù)的正常流程,還是值得這么做的。
總結(jié)一下,符合這種cache的應(yīng)用場(chǎng)景:
1)全局cache命中率低
2)取數(shù)據(jù)過(guò)程耗性能,取得的結(jié)果集本身非常小。
3)在某種場(chǎng)景下,需要多次重復(fù)取數(shù)據(jù)
如果不滿(mǎn)足其中一條,那么這種cache思路,將毫無(wú)價(jià)值。
文中所描述的,僅僅是一種cache的實(shí)現(xiàn)思路,并不是一種技術(shù)。
posted on 2008-03-04 21:30 stone2083 閱讀(416) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): misc