spring boot 高级-缓存、消息

21 篇文章 1 订阅
7 篇文章 0 订阅

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对比

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之墨_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值