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