guava cache通過cachebuilder創建和配置緩存,支持多種過期策略與并發訪問處理。1. 使用cachebuilder設置最大容量、過期時間及移除監聽器;2. 選擇expireafteraccess或expireafterwrite根據數據訪問頻率決定過期策略;3. 緩存本身線程安全,但需自行保證cacheloader的線程安全性;4. maximumsize限制條目數,maximumweight基于權重控制緩存大小;5. 通過cachestats監控命中率、未命中率等性能指標;6. 可集成spring使用@cacheable注解聲明式管理緩存;7. 移除監聽器用于清理資源或記錄日志,確保緩存項移除時正確處理。
Guava Cache 是一個功能強大且易于使用的本地緩存解決方案,它提供了多種緩存策略和配置選項,可以顯著提高應用程序的性能。簡單來說,它就是你在Java代碼里快速構建一個本地緩存的利器。
Guava Cache的用法詳解:本地緩存
Guava Cache 允許你使用多種方式來創建和配置緩存,最常見的方式是使用 CacheBuilder。
立即學習“Java免費學習筆記(深入)”;
LoadingCache<Key, Value> cache = CacheBuilder.newBuilder() .maximumSize(1000) // 設置緩存的最大容量 .expireAfterWrite(10, TimeUnit.MINUTES) // 設置緩存項在寫入后多久過期 .removalListener(removalNotification -> { // 緩存項被移除時的監聽器,可以進行清理工作 System.out.println("Key " + removalNotification.getKey() + " was removed due to " + removalNotification.getCause()); }) .build( new CacheLoader<Key, Value>() { @Override public Value load(Key key) throws Exception { // 當緩存中沒有對應 key 的值時,會調用 load 方法加載 return createExpensiveGraph(key); } });
這個例子展示了如何創建一個具有最大容量、過期時間和移除監聽器的緩存。CacheLoader 定義了如何加載緩存中缺失的值。 當然,你也可以使用 Cache 接口,手動 put 和 get 值,但 LoadingCache 通常更方便。
如何選擇合適的緩存過期策略?
Guava Cache 提供了多種過期策略,包括:
- expireAfterAccess(long duration, TimeUnit unit):緩存項在最后一次被訪問后多久過期。
- expireAfterWrite(long duration, TimeUnit unit):緩存項在寫入后多久過期。
- refreshAfterWrite(long duration, TimeUnit unit):緩存項在寫入后多久可以被刷新。
選擇哪種策略取決于你的應用程序的需求。如果你的數據經常被訪問,expireAfterAccess 可能更合適。如果你的數據很少被訪問,expireAfterWrite 可能更合適。refreshAfterWrite 適合需要定期更新緩存的場景。 比如,一個經常被訪問的配置,使用 expireAfterAccess 可以保證它在一段時間內保持最新。
Guava Cache 如何處理并發訪問?
Guava Cache 默認是線程安全的,它使用并發數據結構來保證多個線程可以同時訪問緩存而不會出現問題。 但是,需要注意的是,如果你的 CacheLoader 中的 load 方法不是線程安全的,那么你需要自己保證線程安全。 簡單來說,緩存本身是安全的,但填充緩存的邏輯要你自己來保證。
Guava Cache 的 maximumSize 和 maximumWeight 有什么區別?
maximumSize 設置緩存的最大條目數,而 maximumWeight 設置緩存的最大權重。 使用 maximumWeight 需要你為每個緩存項指定一個權重,這可以讓你更靈活地控制緩存的大小。 比如,你可以讓大的對象占用更多的緩存空間。 權重計算可以基于對象的大小、復雜程度等等。
Guava Cache 如何監控緩存的性能?
Guava Cache 提供了 CacheStats 類來監控緩存的性能。你可以通過調用 Cache.stats() 方法來獲取 CacheStats 對象。
CacheStats stats = cache.stats(); System.out.println("Hit rate: " + stats.hitRate()); System.out.println("Miss rate: " + stats.missRate()); System.out.println("Eviction count: " + stats.evictionCount());
CacheStats 提供了多種指標,例如命中率、未命中率、驅逐次數等等。這些指標可以幫助你了解緩存的性能,并根據需要調整緩存的配置。 監控命中率可以幫助你判斷緩存是否有效,如果命中率很低,可能需要調整緩存的大小或過期策略。
Guava Cache 如何與 Spring 集成?
雖然 Guava Cache 是獨立的庫,但它也可以很容易地與 Spring 集成。 你可以使用 Spring 的 @Cacheable 注解來將 Guava Cache 集成到你的 Spring Bean 中。 這可以讓你以聲明式的方式使用緩存,而無需手動管理緩存的生命周期。 Spring 提供了 GuavaCacheManager 來管理 Guava Cache 實例。
@Cacheable("myCache") public Value getValue(Key key) { // ... }
在這個例子中,getValue 方法的結果會被緩存到名為 myCache 的 Guava Cache 中。 Spring 會自動處理緩存的讀取和寫入。
Guava Cache 的移除監聽器有什么作用?
移除監聽器允許你在緩存項被移除時執行一些操作。這可以用于清理資源、記錄日志等等。 例如,你可以使用移除監聽器來關閉數據庫連接或釋放文件句柄。
.removalListener(removalNotification -> { // 緩存項被移除時的監聽器,可以進行清理工作 System.out.println("Key " + removalNotification.getKey() + " was removed due to " + removalNotification.getCause()); cleanupResource(removalNotification.getKey()); })
移除監聽器可以幫助你避免資源泄漏,并確保你的應用程序在緩存項被移除時能夠正確地處理。
Guava Cache 是一個非常靈活和強大的本地緩存解決方案,它可以幫助你提高應用程序的性能。 理解其核心概念和配置選項,可以讓你更好地利用它來構建高性能的應用程序。