在第三篇有关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

在Spring中使用多个动态缓存相关推荐

  1. spring_在Spring中使用多个动态缓存

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

  2. 面试——Spring中的循环依赖

    1 什么是Spring循环依赖 // A依赖了B,B是A对象中的一个属性 class A{public B b; }// B依赖了A class B{public A a; } 在普通的代码中,对象之 ...

  3. Spring + Quartz任务调度实战之动态作业调度

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文地址 ...

  4. Spring中@Transactional事务回滚(含实例详细讲解,附源码)

    一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...

  5. 动态代理以及对应Spring中AOP源码分析

    AOP(面向切面编程)在Spring中是被广泛应用的(例如日志,事务,权限等),而它的基本原理便是动态代理. 我们知道动态代理有两种:基于JDK的动态代理以及基于CGlib动态代理.以下是两种动态代理 ...

  6. redis spring 切面缓存_今日份学习: Spring中使用AOP并实现redis缓存?

    笔记 在Spring中如何使用AOP? Spring是如何切换JDK动态代理和CGLIB的? spring.aop.proxy-target-class=true (在下方第二个链接中,原生doc中提 ...

  7. 如何在spring中使用缓存

    Spring Cache 缓存是实际工作中非常常用的一种提高性能的方法, 我们会在许多场景下来使用缓存. 本文通过一个简单的例子进行展开,通过对比我们原来的自定义缓存和 spring 的基于注释的 c ...

  8. spring boot 注解_Spring-Boot项目中如何配置redis注解缓存?

    在pom中添加redis缓存支持依赖 <dependency><groupId>org.springframework.boot</groupId><arti ...

  9. Quartz在Spring中设置动态定时任务 .

    什么是动态定时任务: 是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定).这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...

最新文章

  1. Vue.js 源码目录设计(二)
  2. docker安装linux桌面系统,Hostwinds云主机 – Docker安装Xfce桌面环境(轻量可视化操作系统)...
  3. TSP问题——动态规划
  4. python3练习,python3练习题 - 来自菜鸟的独白
  5. 也谈谈:《设计师如何掌握主动权》读后感
  6. c语言火车票管理系统源代码2000行,C语言教务管理系统[2000行代码].doc
  7. 从xtrabackup备份恢复单表【转】
  8. 【MySQL】MySQL 8 PROCEDURE ANALYSE命令使用
  9. c语言中 dr指令应用,在计算机进行程序存储及控制中,pc.ir.ar和dr各起什么作用?能否相互代替?...
  10. Django--ORM基本操作
  11. 接口与抽象类的相同点和不同点
  12. CE修改器教程总结1
  13. 【转载】正则表达式好文【30分钟教程】
  14. Word文档调整字间距的方法教程【收藏】
  15. Cobalt Strike beacon详解
  16. javascript原生脚本代码 飘浮广告
  17. 量化噪声的大小与什么成正比_量化噪声
  18. 实用的it知识学习_IT榜样 | 寇宇宸:认真听讲是学习知识的绝佳途径
  19. 四年运维人员的一些唠叨
  20. 计算机组成和导论,计算机科学导论五第章计算机组成

热门文章

  1. H - Square Card HDU - 7063
  2. 牛客题霸 [二叉树的之字形层序遍历] C++题解/答案
  3. [HEOI2016TJOI2016]排序(二分+线段树)
  4. CF1628A-Meximum Array【二分】
  5. jzoj1471-Y【bitset,dp,状压】
  6. P5127-子异和【线段树,树链剖分,位运算】
  7. 【2018.4.7】模拟赛之一-ssl2382 K好数【数位dp】
  8. LOJ dfs序1234
  9. 一次频繁Full GC的排查过程,根源居然是它...
  10. equals 和 hashCode 到底有什么联系?一文告诉你