Java Caching System (JCS) 是 Apache Jakarta 專案下的分散式緩存框架,提供高度可配置的多層級儲存 (記憶體、磁碟、側向、遠端) 與簡潔 API。本文從配置檔詳解、四大核心區域架構、基礎 API 操作、物件緩存管理器模式、到元數據監控,完整呈現 JCS 實戰應用。
| 區域類型 | 特性 | 適用場景 |
|---|---|---|
| 記憶體區域 (LRU) | 純記憶體,LRU 淘汰,速度最快 | 熱點資料、首選一級緩存 |
| 磁碟區域 (Indexed) | 鍵值在記憶體,值落磁碟,支援溢寫 | 大容量次級緩存、記憶體不足時溢寫 |
| 側向區域 (Lateral) | 多節點 UDP/TCP 廣播同步,最終一致性 | 叢集環境共享緩存、非強一致需求 |
| 遠端區域 (Remote/RMI) | 中央緩存伺服器,多客戶端 RMI 存取 | 集中式緩存管理、減少序列化開銷 |
區域可組合:如 CompositeCache 先查記憶體,未命中查磁碟,再查遠端。
cache.ccf 詳解jcs.default=jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=1000
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
jcs.default=DISK_REGION
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=1000
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
jcs.region.OUR_REGION=DISK_REGION
jcs.region.OUR_REGION.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.region.OUR_REGION.cacheattributes.MaxObjects=1000
jcs.region.OUR_REGION.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
jcs.region.OUR_REGION.cacheattributes.UseMemoryShrinker=true
jcs.region.OUR_REGION.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.region.OUR_REGION.cacheattributes.ShrinkerIntervalSeconds=60
jcs.region.OUR_REGION.cacheattributes.MaxSpoolPerRun=500
jcs.region.OUR_REGION.elementattributes=org.apache.jcs.engine.ElementAttributes
jcs.region.OUR_REGION.elementattributes.IsEternal=false
jcs.auxiliary.DISK_REGION=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
jcs.auxiliary.DISK_REGION.attributes=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DISK_REGION.attributes.DiskPath=c:/jcs/disk_region
jcs.auxiliary.DISC_REGION.attributes.maxKeySize=100000
關鍵屬性:UseMemoryShrinker 定期清理閒置對象,IsEternal=false 允許過期,DiskPath 必須預先建立目錄。
concurrent.jar, commons-logging.jarcommons-collections.jar, commons-lang.jar// 1. 取得區域實例
JCS cache = JCS.getInstance("OUR_REGION"); // 或 "default"
// 2. 放入物件 (支援任意 Serializable 物件)
cache.put("user:1001", new User(1001, "Alice", "alice@example.com"));
// 3. 取得物件
User u = (User) cache.get("user:1001");
if (u != null) { /* 命中 */ }
// 4. 移除單筆 / 清空區域 / 銷毀區域
cache.remove("user:1001");
cache.clear();
cache.dispose();
以部落格系統為例,封裝 BlogManager 處理「緩存優先、資料庫回補、寫入同步更新」:
public class BlogManager {
private static final String REGION = "BLOG_REGION";
private JCS blogCache = JCS.getInstance(REGION);
public BlogObject getBlog(int id) {
BlogObject blog = (BlogObject) blogCache.get(id);
if (blog == null) { // Cache Miss
blog = DatabaseManager.getBlog(id); // 回源資料庫
if (blog != null) setBlog(blog); // 回填緩存
}
return blog;
}
public boolean setBlog(BlogObject blog) {
try { blogCache.put(blog.getBlogId(), blog); return true; }
catch (CacheException e) { return false; }
}
public boolean evictBlog(int id) {
try { blogCache.remove(id); return true; }
catch (CacheException e) { return false; }
}
}
設計要點:緩存鍵使用業務主鍵;get 回 null 才回源;寫入/更新同步 put;刪除同步 remove。
JCS 提供 JCSAdminBean 程式化存取統計資訊:
// 元素級元數據
JCSAdminBean admin = new JCSAdminBean();
for (CacheElementInfo info : admin.buildElementInfo("OUR_REGION")) {
System.out.println("Key:" + info.getKey() + " Create:" + info.getCreateTime() +
" MaxLife:" + info.getMaxLifeSeconds() + " ExpiresIn:" + info.getExpiresInSeconds());
}
// 區域級統計
for (CacheRegionInfo info : admin.buildCacheInfo()) {
CompositeCache cc = info.getCache();
System.out.println("Region:" + cc.getCacheName() + " Type:" + cc.getCacheType() +
" Hits(RAM):" + cc.getHitCountRam() + " Miss(NotFound):" + cc.getMissCountNotFound() +
" Miss(Expired):" + cc.getMissCountExpired() + " Updates:" + cc.getUpdateCount());
}
利用命中率、過期率、更新頻率調整 MaxObjects、ShrinkerInterval 等參數,實現緩存調優閉環。
JCS 以靈活的區域組合、豐富的配置選項、標準化的管理介面,成為 Java 應用引入緩存層的輕量級首選。掌握「配置先行、管理器封裝、元數據驅動調優」三步法,即可為 Web 應用帶來數量級的效能提升。