如何在SPRING中同時管理本地快取和分散式快取? - techblog
新增@Cacheable可讓spring為您建立一些合理的預設值的快取,但是如果你有多個快取型別,一個用於本地快取,一個用於分散式快取,就不是那麼簡單了。
因此,面對這個問題,我不得不設計一種簡單的機制,將某些快取指定為“分散式”,將某些快取指定為“本地”。單獨使用CompositeCacheManager不會做到這一點,因此我擴充套件了分散式快取管理器(在這種情況下為Hazelcast,但可以使用任何提供程式來完成):
/** * Hazelcast cache manager that handles only cache names with a specified prefix for distributed caches */ public class OptionalHazelcastCacheManager extends HazelcastCacheManager { private static final String DISTRIBUTED_CACHE_PREFIX = "d:"; public OptionalHazelcastCacheManager(HazelcastInstance hazelcast) { super(hazelcast); } @Override public Cache getCache(String name) { if (name == null || !name.startsWith(DISTRIBUTED_CACHE_PREFIX)) { return null; } return super.getCache(name); } } |
以及相應的複合快取管理器配置:
<bean id="cacheManager" class="org.springframework.cache.support.CompositeCacheManager"> <property name="cacheManagers"> <list> <bean id="hazelcastCacheManager" class="com.yourcompany.util.cache.OptionalHazelcastCacheManager"> <constructor-arg ref="hazelcast" /> </bean> <bean id="caffeineCacheManager" class="com.yourcompany.util.cache.FlexibleCaffeineCacheManager"> <property name="cacheSpecification" value="expireAfterWrite=10m"/> <property name="cacheSpecs"> <map> <entry key="statistics" value="expireAfterWrite=1h"/> </map> </property> </bean> </list> </property> </bean> |
基本上,這意味著任何名稱以d:(“ distributed” 開頭)的快取都應由分散式快取管理器處理。否則,請轉到下一個快取管理器(在這種情況下為咖啡因)。因此,當您想定義一個具有可快取結果的方法時,您必須確定它是@Cacheable("d:cachename")還是僅@Cacheable("cachename")
這可能是解決該問題的多種方法之一,但我喜歡它的簡單性。快取是很難的(分散式快取更是如此),雖然我們很幸運能夠擁有Spring抽象的大部分內容,但有時我們還是必須自己處理特殊情況。
相關文章
- 聊聊本地快取和分散式快取快取分散式
- 用Java寫一個分散式快取——快取管理Java分散式快取
- 分散式快取分散式快取
- Redis——快取穿透、快取擊穿、快取雪崩、分散式鎖Redis快取穿透分散式
- 分散式快取 - 快取簡介,常用快取演算法分散式快取演算法
- 結合Hazelcast和Spring的分散式快取 - reflectoringASTSpring分散式快取
- 聊聊分散式快取分散式快取
- 分散式快取方案分散式快取
- redis→分散式快取Redis分散式快取
- JAVA中使用最廣泛的本地快取?Ehcache的自信從何而來3 —— 本地快取變身分散式叢集快取,打破本地快取天花板Java快取分散式
- 分散式系統快取系列一 認識快取分散式快取
- 分散式快取NCache使用分散式快取
- SmartSql Redis 分散式快取SQLRedis分散式快取
- 分散式快取擊穿分散式快取
- 分散式快取綜合指南:Kubernetes + Redis + Spring Boot分散式快取RedisSpring Boot
- 應用實踐:如何在分散式快取中使用RT和WT?分散式快取
- 從快取到分散式快取的那些事快取分散式
- k04_分散式快取分散式快取
- 分散式快取基礎教程分散式快取
- 雲上的分散式快取分散式快取
- 分散式快取 - 概念解釋分散式快取
- 分散式之快取擊穿分散式快取
- 如何在 Spring Boot 中為快取新增壓縮?Spring Boot快取
- Spring 快取Spring快取
- 同為分散式快取,為何 Redis 更勝一籌?分散式快取Redis
- SpringBoot快取管理(一) 預設快取管理Spring Boot快取
- Masa Framework原始碼解讀-02快取模組(分散式快取進階之多級快取)Framework原始碼快取分散式
- ASP.NET Core - 快取之分散式快取ASP.NET快取分散式
- 用Java寫一個分散式快取——快取淘汰演算法Java分散式快取演算法
- WEB 應用快取解析以及使用 Redis 實現分散式快取Web快取Redis分散式
- 小工匠聊架構 - 分散式快取技術_快取設計架構分散式快取
- 分散式系統關注點(18)——「快取穿透」和「快取雪崩」到底啥區別?分散式快取穿透
- 分散式快取架構綜述分散式快取架構
- 分散式系統中有哪些快取?分散式快取
- 【ionic】storage本地快取快取
- 分散式快取--快取與資料庫一致性方案分散式快取資料庫
- 清理 Conda 快取和 Pip 快取快取
- 如何在SpringBoot中清除所有快取 ?Spring Boot快取