1. 程式人生 > >兩級快取框架 J2Cache 的簡單實驗

兩級快取框架 J2Cache 的簡單實驗

原文地址:http://www.oschina.net/question/12_140335

補充為什麼要做這個框架:

說實話,OSC 現在還是單個 Tomcat,只不過我們做了一些分流措施將爬蟲的請求獨立運行了。我一直跟人說 OSC 的擴充套件很容易,只需要加多幾個 Tomcat 就搞定了。如果是純瀏覽的網站的確是這樣的,但事實上並非如此。要讓應用工作在叢集裡,首先 OSC 沒用到 session ,這點是滿足要求的。但是 OSC 目前使用 Ehcache 作為快取框架,這是一個程序內的快取框架,如果叢集的話會導致快取資料不同步。

快取資料不同步有兩個解決辦法:

1. 集中式快取,直接將 Ehcache 換成 Redis 這類產品。如果訪問量不大是沒問題,訪問量大,大量的快取資料訪問使得應用伺服器和快取伺服器之間的網路I/O成為瓶頸,這點我有切身之痛。
2. Ehcache 的分散式(我以前專門寫過一篇

文章),節點間大量的資料複製帶來額外的開銷,在節點多的情況下此問題越發嚴重

因此才有了今天的 J2Cache,引入集中式快取 Redis ,通過程序內的 Ehcache 快取來緩解網路 I/O 瓶頸。同時也降低集中式快取伺服器的壓力。

要對該框架做實驗很簡單,需要下面幾步:

1. 安裝個 Redis 伺服器
2. 從 http://git.oschina.net/ld/J2Cache 上獲取整個專案原始碼
3. 修改 src/redis.properties 檔案中的 host 和 port 項,值為你的 Redis 伺服器的 IP 和 Redis 埠號
4. 執行 build.sh(bat) 命令進行編譯
5. 也可直接在 Eclipse 中匯入該專案並按第 3 步修改 src/redis.properties 配置
6. 開啟控制檯視窗,執行 runtest.sh(bat) 啟動測試客戶端

在我機器上執行第 6 步的結果如下:

7. 開啟另外一個終端視窗,重複執行第 6 步

你要願意的話,可以開啟很多個終端視窗來啟動一個測試的客戶端。

接下來就可以對這個快取框架進行測試,測試的命令包括 get/set/evict/quit,這幾個命令的介紹如下:

set <region> <key> <value> 寫入快取資料 key=value 到 region 區域,例:

?
1 2 3 4 > set cache1 key1 oschina.net Jan 07, 2014 4:16:15 PM net.oschina.j2cache.ehcache.EhCacheProvider buildCache
警告: Could not find configuration [cache1]; using defaults. [cache1,key1]<=oschina.net

上述輸出提示中,已將字串 oschina.net 寫入到 cache1 的 key1 鍵中。

get <region> <key>  從區域<region>讀取鍵為<key>的快取資料,例:

?
1 2 > get cache1 key1 [cache1,key1,L1]=>oschina.net
上述命令執行結果顯示從 cache1 中讀取 key1 的值為 oschina.net,資料存放於 L1,也就是一級快取 Ehcache 中。

這時候可以在其他的終端上再次執行 get 命令,結果就變成:

?
1 2 3 4 > get cache1 key1 Jan 07, 2014 4:19:14 PM net.oschina.j2cache.ehcache.EhCacheProvider buildCache 警告: Could not find configuration [cache1]; using defaults. [cache1,key1,L2]=>oschina.net

上述的 L2 表示資料來自於二級快取 Redis,說明第二個測試客戶端直接從 Redis 獲取到資料。再次執行 get 命令 L2 就變成 L1,說明資料已經在一級快取 Ehcache 中存在。

最後你也可以手工的清除某個快取:

?
1 2 > evict cache1 key1 [cache1,key1]=>null
而你將在其他的測試客戶端上看到如下輸出資訊: ?
1 2 Jan 07, 2014 4:22:55 PM net.oschina.j2cache.CacheChannel onDeleteCacheKey 資訊: Received cache evict message, region=cache1,key=key1

要退出測試客戶端,輸入 quit 即可。

另外當 Ehcache 中的某個快取資料應該時間長失效後,也會自動廣播到組裡所有節點,通知其清除快取。

說明一下,Ehcache 本身是支援叢集的,但如果快取更新頻繁的話,節點間傳輸的資料量也會很大。J2Cache 的節點間只傳輸 evict 命令,例如 A 節點通知 B 節點清除某個快取資料,因此只需要傳遞 region 和 key 資訊即可。

接下來我們將內部對 OSChina 專案遷移到該框架上進行全面測試。歡迎大家嘗試。並給我們提建議:)