在Spring中使用多个动态缓存

在第三篇有关Spring(长时间)的缓存管理器的文章中,我想通过展示如何配置多个动态创建缓存的缓存管理器来扩展 两个

Spring具有CompositeCacheManager ,从理论上讲,它应该允许使用多个缓存管理器。 它通过询问基础缓存管理器是否具有请求名称的缓存来工作。 问题是当您需要基于某些全局配置动态创建的缓存时。 这是常见的情况,当您不想手动定义缓存,而只想添加@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" > 
                     < "hazelcast" 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抽象的大部分内容,但有时我们还是必须自己处理特殊情况。

翻译自: https://www.javacodegeeks.com/2020/06/using-multiple-dynamic-caches-with-spring.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值