Ehcache 在單機/少量節點表現良好,但叢集環境下多播同步效能隨節點增長急劇下降,穩定性堪慮。memcached 採用客戶端-伺服器中心化架構,廣泛用於大型網站,新版 Java Client (spymemcached) 效能大幅提升。
id=1),直接寫入 memcached 會導致不同物件互相覆蓋,反序列化時拋出 ClassCastException。實作自訂 MemcachedCacheProvider,將 Hibernate 傳入的 regionName (快取區域名) 與原始 Key 組合生成新 Key:
String newKey = regionName + ":" + key;
讀寫快取皆使用新 Key,徹底隔離不同區域資料。
HQL 查詢快取 Key 可能包含 memcached 協議保留字元(空白、控制字元等),導致解析錯誤。二次封裝方案:
newKey = String.valueOf(originalKey.hashCode()),極低機率碰撞。newKey = MD5(originalKey),完全避開特殊字元,推薦用於生產環境。替換 Ehcache 為 memcached 後,應用程式運行穩定,叢集快取一致性問題解決,效能表現優異。
完整實作請見:MemcachedCacheProvider.java(含詳細註解)。