在 SPRING 中使用多个动态缓存

在本文开始前,先给大家分享几个好用的IDEA激活码

这里提供几个最新的激活码,有需要的朋友可以试试,先到先用:

2022Intellij IDEA最新激活码,IDEA稳定专属激活码(持续更新)

2022Pycharm激活码,Pycharm稳定专属激活码(持续更新)

2022Webstorm激活码,Webstorm稳定专属激活码(持续更新)

2022Phpstorm激活码,Phpstorm稳定专属激活码(持续更新)

2022Goland激活码,Goland稳定专属激活码(持续更新)

 

在春季关于缓存管理器的第三篇文章中(在很长一段时间内),我想通过展示如何配置多个动态创建缓存的缓存管理器来扩展前 两个。

从理论上讲, 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

(0)
上一篇 2022年10月15日 下午8:10
下一篇 2022年10月16日 下午8:14

相关推荐

  • Typescript、Angular 和 Nest JS 概述

    在本文开始前,先给大家分享几个好用的IDEA激活码 这里提供几个最新的激活码,有需要的朋友可以试试,先到先用: 2022Intellij IDEA最新激活码,IDEA稳定专属激活码(持续更新) 2022Pycharm激活码,Pycharm稳定专属激活码(持续更新) 2022Webstorm激活码,Webstorm稳定专属激活码(持续更新) 2022Phpst…

    2022年10月28日
    00
  • 软件工程师情商指南

    在本文开始前,先给大家分享几个好用的IDEA激活码 这里提供几个最新的激活码,有需要的朋友可以试试,先到先用: 2022Intellij IDEA最新激活码,IDEA稳定专属激活码(持续更新) 2022Pycharm激活码,Pycharm稳定专属激活码(持续更新) 2022Webstorm激活码,Webstorm稳定专属激活码(持续更新) 2022Phpst…

    2022年10月15日
    00
  • 您的第一份编程工作:成功的四种方法!

    在本文开始前,先给大家分享几个好用的IDEA激活码 这里提供几个最新的激活码,有需要的朋友可以试试,先到先用: 2022Intellij IDEA最新激活码,IDEA稳定专属激活码(持续更新) 2022Pycharm激活码,Pycharm稳定专属激活码(持续更新) 2022Webstorm激活码,Webstorm稳定专属激活码(持续更新) 2022Phpst…

    2022年10月31日
    00
  • 密码保护:Spring Cloud Alibaba笔记

    无法提供摘要。这是一篇受保护的文章。

    2022年11月14日
    00
  • 密码保护:Django开发实战课程快速开发

    无法提供摘要。这是一篇受保护的文章。

    2022年11月4日
    00

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注