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);}@Overridepublic 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

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. Quartz 在 Spring 中如何动态配置时间

    在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度. 有关调度的实现我就第一就想到了Quartz这个开源调度组件,因为很多项目使用过,Spring结合Quartz静态配置调度任务时间 ...

  8. spring框架中JDK和CGLIB动态代理区别

    转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言 JDK动态代理实现原理(jdk8):https://blog.csdn.net ...

  9. Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)

    第一种代理即Java的动态代理方式上一篇已经分析,在这里不再介绍,现在我们先来了解下GCLIB代理是什么?它又是怎样实现的?和Java动态代理有什么区别? cglib(Code Generation ...

最新文章

  1. 性能测试-Jmeter
  2. java线程实现方式
  3. gradle生命周期
  4. FPGA的一些细节(持续更新)
  5. 关于android隐式启动activity的分析和说明,Android学习之Intent中显示意图和隐式意图的用法实例分析...
  6. TModalResult 和 MessageBox 返回值
  7. ERP+WMS信息一体化案例:汽车钢板弹簧企业【神风弹簧】
  8. KeilC51基础 改变代码的字体大小
  9. MiR机器人ROS仓库
  10. qlabel 添加图标_Qt之添加图标
  11. 怎么在计算机上搭建远程桌面,创建远程桌面连接的方法
  12. C#实战之CAD二次开发002:绘制直线和绘制圆
  13. 记录一次服务器被攻击的经历
  14. 百度文库会员什么时候便宜
  15. 多线程基础:两种实现方式
  16. 英语语法汇总(1.名词)
  17. 神通数据库OSCAR安装
  18. 网易云音乐、QQ音乐等映射网络路径(下载选SQ或者hires即可 其他太大了……)
  19. 十月下旬腾讯 网易游戏 百度迅雷校园招聘笔试题集锦 第271 330题
  20. 从弦振动方程说开去——解开音乐的密匙

热门文章

  1. 使用intelliJ创建 spring boot + gradle + mybatis站点
  2. 《JavaScript权威指南第六版》学习笔记-JavaScript概述
  3. solr索引服务器的配置和solrj集成开发总结
  4. 对于数据库中表示状态或类型字段表示方法的思考
  5. 【BZOJ】1067: [SCOI2007]降雨量(rmq+变态题)
  6. C#关于精确年龄的算法(精确到天)
  7. ASP.NET4.0中客户端ID的生成
  8. C++ string类的方法
  9. python3 multiprocessing 多进程 列表类型 listproxy 清除内容
  10. docker 可视化管理工具 rancher 简介