spring boot 高级-缓存消息
Posted 之墨_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot 高级-缓存消息相关的知识,希望对你有一定的参考价值。
spring boot与缓存、消息
1.缓存
1.1JSR-107
什么是JSR-107?
JSR是Java Specification Requests的缩写,意思是Java规范提案。2012年10月26日JSR规范委员会发布了JSR 107(JCache API)的首个早期草案。
JCache规范定义了一种对Java对象临时在内存中进行缓存的方法,包括对象的创建、共享访问、假脱机(spooling)、失效、各JVM的一致性等,可被用于缓存JSP内最经常读取的数据。
Java Caching定义了5个核心接口,分别是CachingProvider
, CacheManager
, Cache
, Entry
和 Expiry
。
• CachingProvider
定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可
以在运行期访问多个CachingProvider。
• CacheManager
定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache
存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
• Cache
是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个
CacheManager所拥有。
• Entry
是一个存储在Cache中的key-value对。
• Expiry
每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期
的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。
1.2Spring缓存抽象
Spring从3.1开始定义了org.springframework.cache.Cache
和org.springframework.cache.CacheManager
接口来统一不同的缓存技术;
并支持使用JCache(JSR-107)注解简化我们开发;
• Cache
接口为缓存的组件规范定义,包含缓存的各种操作集合;
• Cache
接口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache , ConcurrentMapCache等;
• 每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。
• 使用Spring缓存抽象时我们需要关注以下两点;
1、确定方法需要被缓存以及他们的缓存策略
2、从缓存中读取之前缓存存储的数据
1.2.1搭建基本环境&缓存入门体验
/*
*一、搭建基本环境
* 1、导入数据库文件,创建department、employee表
* 2、创建javaBean封装数据
* 3、整合MyBatis操作数据库
* 1.配置数据源信息
* 2.使用注解版的MyBatis
* 1)、@MappingScan指定需要扫描的包
* 二、快速体验缓存
* 步骤:
* 1、开启基于注解的缓存
* 2、标注缓存注解即可
* @Cacheable
* 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
* @CacheEvict
* 清空缓存
* @CachePut
* 保证方法被调用,又希望结果被缓存。
*/
1.2.2缓存缓存工作原理&运行流程
/*
*将方法的运行结果进行缓存,以后再需要相同的数据,直接从缓存中获取,不用调用方法
* 原理:
* 1、自动配置类: CacheAutoConfiguration
* 2.缓存的配置类
* org. springframework.boot.autoconfigure.cache.GenericCacheConfigurqtion
* org. springframework.boot.autoconfigure.cache.ICacheCacheConfiguration
* org. springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration
* org. springframework.boot.autoconfigure.cache.HazelcastCacheConfiguration
* org. springframework.boot.autoconfigure.cache.InfinispanCacheConfiguration
* org. springframework.boot.autoconfigure.cache.CouchbaseCacheConfiguration
* org. springframework.boot.autoconfigure.cache.RedisCacheConfiguration
* org. springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration
* org. springframework.boot.autoconfigure.cache.GuavaCacheConfiguration
* org. springframework.boot.autoconfigure.cache.SimpleCacheConfiguration
* org. springframework.boot.autoconfigure.cache.NoOpCacheConfiguration
* 3、哪个配置类默认生效:
* SimpleCacheConfiguration
* 4、给容器中注册了一个CacheManager;ConcurrentMapCacheManager
* 5、可以获取和创建ConcurrentMapCache类型的缓存组件;它的作用是将数据保存在ConcurrentMap中;
*
* 运行流程:
* @Cacheable
* 1、方法运行之前、先查询Cache(缓存组件)
* (CacheManager先获取相应的缓存),第一次获取缓存如果没有cache组件会自动创建
* 2、去Cache中查找缓存的内容,使用第一个key,默认就是方法的参数;
* key是按照某种策略生成的,默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key
* SimpleKeyGenerator生成key的默认策略:
* 如果没有参数;key = new SimpleKey();
* 如果有一个参数:key=参数的值
* 如果有多个参数:key = new SimpleKey(params);
* 3、没有查到缓存的就调用目标方法
* 4、将目标方法返回的结果,放进缓存中
*
* @Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询缓存
* 如果没有就运行方法并将结果放入缓存
*
* 核心
* 1)、使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】组件
* 2)、key使用keyGenerator生成的,默认是SimpleKeyGenerator
*/
1.2.3几个重要概念&缓存注解
缓存功能的原理结构示意图
1.2.4@Cacheable的几个属性
/*
* cacheNames/value:指定缓存组件的名字
* key:缓存数据使用的key;可以用它来指定。默认是使用方法参数的值 1-方法的返回值
* 编写SpEL: #id;参数id的值 #a0 #p0 Mroot. args[0]
* keyGenerators key的生成器:可以自己指定key的生成器的组件id
* key/keyGenerator:二选一使用
* cacheManager:指定缓存管理器:或者cacheResol ver指定获取解析器
* condition:指定符合条件的情况下才缓存:
* ,condition="#id>0"
* unless:否定缓存:当unless指定的条件为true,方法的返回值就不会被缓存:可以获取到结果进行判断
* unless = "#result = null "
* unless = "#a0==2";如果第一个参数的值是2,结果不缓存
* sync:是否使用异步模式
1.3整合Redis
- 引入spring-boot-starter-data-redis
- application.yml配置redis连接地址
- 使用RestTemplate操作redis
- redisTemplate.opsForValue();//操作字符串
- redisTemplate.opsForHash();//操作hash
- redisTemplate.opsForList();//操作list
- redisTemplate.opsForSet();//操作set
- redisTemplate.opsForZSet();//操作有序set
- 配置缓存、CacheManagerCustomizers
- 测试使用缓存、切换缓存、 CompositeCacheManager
2.消息
2.1概述
- 大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力
- 消息服务中两个重要概念:
消息代理(message broker
)和目的地(destination
)
当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定目
的地。 - 消息队列主要有两种形式的目的地
- 队列(
queue
):点对点消息通信(point-to-point
) - 主题(
topic
):发布(publish
)/订阅(subscribe
)消息通信 - 点对点式:
– 消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,
消息读取后被移出队列
– 消息只有唯一的发送者和接受者,但并不是说只能有一个接收者 - 发布订阅式:
– 发送者(发布者)发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,那么
就会在消息到达时同时收到消息 - JMS(
Java Message Service
)JAVA消息服务:
– 基于JVM消息代理的规范。ActiveMQ
、HornetMQ
是JMS
实现 - AMQP(
Advanced Message Queuing Protocol
)
– 高级消息队列协议,也是一个消息代理的规范,兼容JMS
– RabbitMQ是AMQP
的实现 - Spring支持
–spring-jms
提供了对JMS
的支持
–spring-rabbit
提供了对AMQP
的支持
– 需要ConnectionFactory
的实现来连接消息代理
– 提供JmsTemplate
、RabbitTemplate
来发送消息
– @JmsListener
(JMS
)、@RabbitListener
(AMQP
)注解在方法上监听消息代理发
布的消息
– @EnableJms
、@EnableRabbit
开启支持 - Spring Boot自动配置
–JmsAutoConfiguration
–RabbitAutoConfiguration
2.2异步处理、应用解耦、流量削峰
2.4JMS与AMQP对比
以上是关于spring boot 高级-缓存消息的主要内容,如果未能解决你的问题,请参考以下文章