javascript
使用Caffeine和Spring Boot的多个缓存配置
緩存是幾乎每個應用程序性能的關鍵。 有時需要分布式緩存 ,但并非總是如此。 在許多情況下,本地緩存可以很好地工作,并且不需要分布式緩存的開銷和復雜性。
因此,在許多應用程序中,包括普通的Spring和Spring Boot,您可以在任何方法上使用@Cacheable ,并且其結果將被緩存,以便下次調用該方法時,將返回緩存的結果。
Spring有一些默認的緩存管理器實現,但是外部庫總是比簡單的實現更好,更靈活。 例如,咖啡因是一種高性能的 Java緩存庫 。 Spring Boot帶有CaffeineCacheManager 。 因此,理想情況下,這就是您所需要的一切–您只需創建一個緩存管理器bean,并為@Cacheable注釋方法進行緩存。
但是,提供的緩存管理器僅允許您配置一個緩存規范。 緩存規范包括到期時間,初始容量,最大大小等。因此,將使用單個緩存規范來創建此緩存管理器下的所有緩存。 高速緩存管理器支持預定義高速緩存以及動態創建的高速緩存的列表,但是在兩種情況下都使用單個高速緩存規范。 這對于生產來說很少有用。 通常,內置緩存管理器是您必須要小心的地方 。
有一些 博客文章告訴您如何使用自定義規范定義自定義緩存。 但是,這些選項不支持內置管理器支持的動態默認緩存規范用例。 理想情況下,您應該能夠使用@Cacheable任何名稱,并且應該使用某些默認規范自動創建緩存,但是您還應該選擇覆蓋特定緩存的名稱。
這就是為什么我決定使用一種比在代碼中定義所有緩存以提供更大靈活性的簡單方法。 它擴展了CaffeineCacheManager以提供該功能:
/** * Extending Caffeine cache manager to allow flexible per-cache configuration */ public class FlexibleCaffeineCacheManager extends CaffeineCacheManager implements InitializingBean { private Map<String, String> cacheSpecs = new HashMap<>(); private Map<String, Caffeine<Object, Object>> builders = new HashMap<>(); private CacheLoader cacheLoader; @Override public void afterPropertiesSet() throws Exception { for (Map.Entry<String, String> cacheSpecEntry : cacheSpecs.entrySet()) { builders.put(cacheSpecEntry.getKey(), Caffeine.from(cacheSpecEntry.getValue())); } } @Override @SuppressWarnings ( "unchecked" ) protected Cache<Object, Object> createNativeCaffeineCache(String name) { Caffeine<Object, Object> builder = builders.get(name); if (builder == null ) { return super .createNativeCaffeineCache(name); } if ( this .cacheLoader != null ) { return builder.build( this .cacheLoader); } else { return builder.build(); } } public Map<String, String> getCacheSpecs() { return cacheSpecs; } public void setCacheSpecs(Map<String, String> cacheSpecs) { this .cacheSpecs = cacheSpecs; } public void setCacheLoader(CacheLoader cacheLoader) { super .setCacheLoader(cacheLoader); this .cacheLoader = cacheLoader; } }簡而言之,它會根據規格創建一個咖啡因生成器,并在需要新的緩存時使用它代替默認生成器。
然后,樣本XML配置將如下所示:
< bean id = "cacheManager" class = "net.bozho.util.FlexibleCaffeineCacheManager" > < property name = "cacheSpecification" value = "expireAfterWrite=10m" /> < property name = "cacheSpecs" > < map > < entry key = "statistics" value = "expireAfterWrite=1h" /> </ map > </ property > </ bean >使用Java配置,它非常簡單–您只需設置cacheSpecs映射即可。
盡管Spring已經變成了一個龐大的框架,可以提供各種各樣的功能,但它并沒有放棄可擴展性的設計原則。
擴展內置框架類經常發生,應該在每個人的工具箱中。 創建這些類時要考慮到擴展名-您會注意到CaffeineCacheManager中的許多方法都protected 。 因此,我們應在需要時利用它。
翻譯自: https://www.javacodegeeks.com/2019/05/multiple-cache-configurations-caffeine-spring-boot.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的使用Caffeine和Spring Boot的多个缓存配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gbp是什么 gbp的意思
- 下一篇: iphone12手写键盘怎么设置