在本文开始前,先给大家分享几个好用的IDEA激活码
这里提供几个最新的激活码,有需要的朋友可以试试,先到先用:
2022Intellij IDEA最新激活码,IDEA稳定专属激活码(持续更新)
2022Pycharm激活码,Pycharm稳定专属激活码(持续更新)
2022Webstorm激活码,Webstorm稳定专属激活码(持续更新)
在春季关于缓存管理器的第三篇文章中(在很长一段时间内),我想通过展示如何配置多个动态创建缓存的缓存管理器来扩展前 两个。
从理论上讲, SpringCompositeCacheManager
应该允许使用多个缓存管理器。它通过询问底层缓存管理器是否有具有请求名称的缓存来工作。问题是当您需要基于一些全局配置动态创建的缓存时。这是常见的场景,当您不想手动定义缓存,而是只想添加@Cacheable
并让 spring(和底层缓存管理器)为您创建具有一些合理默认值的缓存时。
在您需要拥有多个缓存管理器之前,这很好。例如 – 一个用于本地缓存,一个用于分布式缓存。在许多情况下,需要分布式缓存;然而,并不是所有的方法调用都需要被分发——有些方法调用可以在处理它的实例中是本地的,并且你不想用可以保存在本地的东西给你的分布式缓存增加负担。您是否可以配置分布式缓存提供程序以将某些缓存指定为本地缓存,即使它由分布式缓存提供程序处理 – 也许,但我不保证这将是微不足道的。
因此,面对这个问题,我必须设计一些简单的机制,将一些缓存指定为“分布式”,而将一些缓存指定为“本地”。单独使用CompositeCacheManager
是不行的,所以我扩展了分布式缓存管理器(在本例中是 Hazelcast,但可以使用任何提供者来完成):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/** * 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); } } |
以及相应的复合缓存管理器配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
< 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:
(对于“分布式”)开头的缓存都应该由分布式缓存管理器处理。否则,继续下一个缓存管理器(在这种情况下为咖啡因)。所以当你想定义一个具有可缓存结果的方法时,你必须决定它是@Cacheable("d:cachename")
还是只是@Cacheable("cachename")
这可能是解决该问题的众多方法之一,但我喜欢它的简单性。缓存很困难(分布式缓存更是如此),虽然我们很幸运拥有 Spring 的大部分抽象,但有时我们必须自己处理特殊情况。
发布者:admin,转转请注明出处:https://www.ajihuo.com/soft/5004.html