J2Cache開源中國兩級緩存實踐
本文由紅薯在 開源中國-OSC源創會第58期【福州站】的演講整理而成。
本文總字數:1516個
預計閱讀時間:8分鍾
嘉賓演講視頻地址:https://t.cn/RSlMZEX
嘉賓PPT下載地址:https://t.cn/RCIVAlD
開源中國的現狀
我們現在全球排名是大概800名,每天的ip數超過80萬,大概1000萬的PV,超過5000萬的動態請求。
開源中國有幾個應用的策略,可能不僅僅是開源中國,我們整個做web網站的時候,緩存應用都有以下的幾個場景。
對象緩存
對象緩存就是根據用戶的編號,拿到用戶的詳細的資料。這個非常好理解。
列表緩存
比如我們今天發了什麼新聞,會有一個列表的頁麵,這個列表存的是一個ID。假如要改一篇新聞,我們就可以根據ID獲取它的渠道列表後再找到新聞詳細的內容。這樣隻需要改一個對象緩存,清除那個對象緩存再更新一下就好了。
頁麵片段緩存
頁麵片段就好比首頁有很多的內容,可以把某一塊html保存到內存裏,這樣輸出會很快。
在清除緩存的時候,我們的策略還有過期自動清除、程序清除和手工清除。
Ehcache緩存框架
開源中國是用Java開發的。Java在做緩存的時候有一個很著名的Ehcache框架,它是基於內存的一個緩存框架,速度非常快。因為不能把所有數據都放在內存裏,它可以把一部分數據放進磁盤,是一個兩級的緩存。它還支持多個區域的緩存結構,用戶是一個緩存,新聞帖子之類的可以單獨設置緩存失效策略。Ehcache還提供了緩存數據的偵聽接口。一個緩存數據一旦出現問題,就會得到通知。Ehcache也支持集群部署。
J2Cache
開源中國成立公司是在2011年,網站在2008年就上線了。這個網站撐了有兩三年的時間,後來數據長得很快,就開始出現問題了。第一個就是單節點無法應付高並發的訪問。還有一個最可怕的問題就是因為程序更新很頻繁,Java每次更新的時候都要重啟。一旦重啟後,整個Ehcache緩存裏的數據都被清掉。所以說重啟然後大量訪問進來的話,數據庫基本上很快就會崩掉了。
那麼我們為什麼不選擇Ehcache的集群方案呢?因為當我們在一個節點裏存數據的時候,它同時會通過網絡傳播的形式將數據複製到其它節點。這樣會造成網絡開銷很大。而不用redis則是因為它讀緩存數據非常慢。
我們想的方案是把Ehcache和redis結合起來,取長補短。盡量從本機取數據,取不到的時候再去redis裏麵取。
Ehcache+ redis,就是J2Cache。
這樣結合可以保證高性能。數據基本上都是從Ehcache裏麵取的,有效的緩解應用冷啟動對數據庫的壓力。應用和redis之間不會有大量的數據傳輸,因為大量數據傳輸隻存在於冷啟動的時候。
J2Cache數據讀取流程
每次讀數據的時候首先從Ehcache裏先讀,因為Ehcache在你的內存中。如果有的話直接返回,沒有的話就通過通過網絡去讀redis的數據,如果數據有的話就把它塞到Ehcache裏麵,再返回。如果redis也沒有,這時才讀數據庫的數據,然後同時把它的數據塞到Ehcache和redis裏麵,最後返回數據。
J2Cache數據更新流程
清除數據首先是要清除節點。其他節點在收到這個命令的時候,它會清除當前Ehcache裏麵對應的數據。這樣的話清除某一個節點數據,然後通過廣播把這數據給其他其他節點,同時也清楚這個數據,這樣就保證了整個集群裏麵的緩存數據是同步的。
序列化庫的選擇
因為緩存數據要通過網絡傳輸到redis上,所以我們要求所有的對象都必須是可序列化的。我們最終使用的是FST,因為它速度很快,生成的那個序列號體積也比較小,關鍵是它對你的項目沒有任何侵入性。
我今天要分享的就這些,謝謝!
編者:IT大咖說,歡迎關注“itdakashuo”,@IT大咖說 ,轉載請標明版權和出處。
最後更新:2017-08-21 10:32:44