如何在Spring中使用多个动态缓存

发布时间:2022-02-28 11:18:12 作者:小新
来源:亿速云 阅读:188

这篇文章给大家分享的是有关如何在Spring中使用多个动态缓存的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

CompositeCacheManager从理论上讲,Spring应该允许使用多个缓存管理器。它的工作原理是询问底层缓存管理器是否有具有请求名称的缓存。问题在于当您需要基于某些全局配置动态创建的缓存时。这是常见的情况,当您不想手动定义缓存,而只想添加@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”)开头的任何缓存都应该由分布式缓存管理器处理。否则,继续下一个缓存管理器(在本例中为Caffeine)。所以当你想定义一个带有可缓存结果的方法时,你必须决定它是@Cacheable("d:cachename")还是只是@Cacheable("cachename")

这可能是解决该问题的众多方法之一,但我喜欢它的简单性。缓存很难(分布式缓存更是如此),虽然我们很幸运有 Spring 抽象了大部分内容,但有时我们必须自己处理特殊情况。

感谢各位的阅读!关于“如何在Spring中使用多个动态缓存”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

推荐阅读:
  1. 如如何使用journalctl命令?
  2. spring boot 使用 redis 缓存

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring

上一篇:怎么使用Hibernate在Java中批量更新或插入数据库表

下一篇:php如何反转一个整数

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》