spring boot 高级-缓存消息

Posted 之墨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot 高级-缓存消息相关的知识,希望对你有一定的参考价值。

1.缓存

1.1JSR-107

原文引用《剖析缓存系列》—— 熟悉JSR-107 JAVA缓存规范

什么是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的实现;如RedisCacheEhCacheCache , 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

  1. 引入spring-boot-starter-data-redis
  2. application.yml配置redis连接地址
  3. 使用RestTemplate操作redis
  4. redisTemplate.opsForValue();//操作字符串
  5. redisTemplate.opsForHash();//操作hash
  6. redisTemplate.opsForList();//操作list
  7. redisTemplate.opsForSet();//操作set
  8. redisTemplate.opsForZSet();//操作有序set
  9. 配置缓存、CacheManagerCustomizers
  10. 测试使用缓存、切换缓存、 CompositeCacheManager

2.消息

2.1概述

  1. 大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力
  2. 消息服务中两个重要概念:
    消息代理message broker)和目的地destination
    当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定目
    的地。
  3. 消息队列主要有两种形式的目的地
  4. 队列queue):点对点消息通信(point-to-point
  5. 主题topic):发布publish)/订阅subscribe消息通信
  6. 点对点式
    – 消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,
    消息读取后被移出队列
    – 消息只有唯一的发送者和接受者,但并不是说只能有一个接收者
  7. 发布订阅式
    – 发送者(发布者)发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,那么
    就会在消息到达时同时收到消息
  8. JMSJava Message Service)JAVA消息服务:
    – 基于JVM消息代理的规范。ActiveMQHornetMQJMS实现
  9. AMQPAdvanced Message Queuing Protocol
    高级消息队列协议,也是一个消息代理的规范,兼容JMS
    RabbitMQAMQP的实现
  10. Spring支持
    spring-jms提供了对JMS的支持
    spring-rabbit提供了对AMQP的支持
    – 需要ConnectionFactory的实现来连接消息代理
    – 提供JmsTemplateRabbitTemplate来发送消息
    – @JmsListenerJMS)、@RabbitListenerAMQP)注解在方法上监听消息代理发
    布的消息
    – @EnableJms、@EnableRabbit开启支持
  11. Spring Boot自动配置
    JmsAutoConfiguration
    RabbitAutoConfiguration

2.2异步处理、应用解耦、流量削峰



2.4JMS与AMQP对比

以上是关于spring boot 高级-缓存消息的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 整合 RabbitMQ

Spring Boot 操作 Memcache

Spring Boot异步消息之AMQP讲解及实战(附源码)

Spring Boot 2.x 集成 Redis 缓存

Spring Boot集成Redis实现缓存

Spring Boot集成Redis实现缓存