兩級快取框架 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
|
這時候可以在其他的終端上再次執行 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 專案遷移到該框架上進行全面測試。歡迎大家嘗試。並給我們提建議:)