Spring 那些事【2】SpringCache 简介及应用?

news2024/12/26 22:41:18

一、简介

SpringCache 是Spring 提供的一整套的缓存解决方案,他不是具体的缓存实现,它只提供了一整套的接口和代码规范、配置、注解等,用于整合各种缓存方案。

Spring 从 3.1 开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术,并支持使用 JCache(JSR-107)注解简化我们开发。

Cache 接口为缓存的组件规范定义,包含缓存的各种操作集合;

Cache 接口下 Spring 提供了各种 xxCache 的实现,如 RedisCache、EhCacheCache、ConsurrentMapCache 等;

  • 每次调用需要缓存功能的方法时,Spring 会检查指定参数的指定目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户,下次调用直接从缓存中获取。
  • 使用 Spring 缓存抽象时我们需要关注以下两点:
    • 1、确定方法需要被缓存以及它们的缓存策略
    • 2、从缓存中读取之前缓存存储的数据

二、使用

2.1 搭建

2.1.1 导入依赖

        <!--  引入 redis    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
        
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

2.1.2 写配置

  • 自动配置了哪些?

CacheAutoConfiguration 会导入 RedisCacheConfiguration;

自动配好了缓存管理器 RedisCacheManager

  • 配置使用 redis 作为缓存
spring.cache.type=redis

在启动类上开启注解

@EnableCaching

2.1.3 测试使用缓存

对于缓存声明,Spring的缓存抽象提供了一组Java注解:

  • @Cacheable:触发缓存填充。
  • @CacheEvict: 触发将数据从缓存删除的操作。(失效模式使用这个注解)
  • @CachePut:在不干扰方法执行的情况下更新缓存。(双写模式使用这个注解)
  • @Caching:重新组合多个缓存操作以应用于一个方法。
  • @CacheConfig:在类级别共享一些常见的缓存相关设置。
@Override
@Cacheable({"xiaolei"}) // 当前方法结果需要缓存,如果缓存有,方法不用调用。如果缓存没有,会调用方法,最后将方法的结果放入缓存
public List<CategoryEntity> getLevel1Categorys() {
    System.out.println("进入方法");
    List<CategoryEntity> list = baseMapper.selectList(new LambdaQueryWrapper<CategoryEntity>().eq(CategoryEntity::getCatLevel, 1));
    return list;
    }

2.1.4 Cacheable 细节设置

使用 Cahceable ,默认会有几个行为:

  • 1、如果缓存中有,方法不用调用
  • 2、key 默认自动生成,缓存的名字为:category::simplekey[](自动生成的 key 值)
  • 3、缓存的 value 的值,默认使用 jdk 序列化机制,将序列化后的数据存到 redis
  • 4、默认时间: -1 (不符合规范)

我们需要自定义一些需求:

1) 指定生成的缓存使用的 key : key 属性指定,接受一个 spEL.

key 的表达式可以有很多方法动态获取。例如方法名作为缓存key等(#root.method.name)

@Cacheable(value = {"xiaolei"},key = "'sysId:product:category'")

2) 指定缓存的数据的存活时间: 在配置文件中修改

spring.cache.redis.time-to-live=3600000

 

3) 将数据保存为 json 格式

  • cacheAutoConfiguration
  • RedisCacheConfiguration
@Configuration
@EnableCaching
@EnableConfigurationProperties(CacheProperties.class) // 开启属性配置的绑定功能
public class MyCacheConfig {

    @Autowired
    CacheProperties cacheProperties;

    /**
     * 配置文件中的配置没有用上.
     * 原来配置文件绑定的配置类需要让它生效.
     * @return
     */
    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        config=config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        config=config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }
        return config;
    }
}

原理:

通过CacheAutoConfiguration 获取到 redisCahceConfiguration,它自动初始化所有的缓存-> 每个缓存决定使用什么配置,就看配置文件中有没有,如果有,就用配置文件中的值,如果没有,就用缓存中的值。-> 想改缓存的配置,只需要给容器中放一个 RedisCacheConfiguration 即可。-> 就会想应用。

2.1.5 cacheing

默认失效模式,即删除缓存。

删除单个 key

@CacheEvict(value = "xiaolei",key = "'sysId:product:category'")

删除多个缓存

    @Caching(evict = {
            @CacheEvict(value = "xiaolei",key = "'sysId:product:category'"),
            @CacheEvict(value = "xiaolei",key = "'sysId:product:category2'")
    })

存储同一类型的数据,都可以指定同一个分区。

默认就是分区名作为缓存的名字。

2.2 原理与不足

2.2.1 读模式

  • 缓存穿透:查询一个 null 数据。解决:缓存空数据,cache-null-value = true
  • 缓存击穿:大量并发进来同时查询一个正好过期的数据。解决:加锁?默认是无加锁的。(sync =true )加锁解决
  • 缓存雪崩:大量的 key 同时过期。解决:加随机时间。(加上过期时间就行)

2.2.2 写模式(缓存与数据库一致)

  • 读写加锁
  • 引入 Cannal:感知 mysql 的更新去更新数据库
  • 都多写多:直接去数据库查询就行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2253040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言:指针与数组

一、. 数组名的理解 int arr[5] { 0,1,2,3,4 }; int* p &arr[0]; 在之前我们知道要取一个数组的首元素地址就可以使用&arr[0]&#xff0c;但其实数组名本身就是地址&#xff0c;而且是数组首元素的地址。在下图中我们就通过测试看出&#xff0c;结果确实如此。 可是…

2023年04-至今:宏图一号L2级系统几何校正影像(1、3、5m)

目录 简介 摘要 代码 网址推荐 机器学习 2023年04-至今&#xff1a;宏图一号L2级系统几何校正影像&#xff08;1、3、5m&#xff09; 简介 作为航天宏图“女娲星座”建设计划的首发卫星&#xff0c;航天宏图-1号可获取0.5米-5米的分辨率影像&#xff0c;具备高精度地形测…

挑战用React封装100个组件【009】

Hello&#xff0c;大家好&#xff0c;今天我挑战的组件是这样的&#xff01; 欢迎大家把项目拉下来使用哦&#xff01; 项目地址&#xff1a; https://github.com/hismeyy/react-component-100 今天还是用到了react-icons。这里就不过多介绍啦&#xff0c;大家可以在前面的挑战…

【每日刷题】Day162

【每日刷题】Day162 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 3302. 字典序最小的合法序列 - 力扣&#xff08;LeetCode&#xff09; 2. 44. 通配符匹配 - 力扣&…

什么工具可以解决团队协作障碍?

团队协作是现代工作环境中至关重要的一部分&#xff0c;但在实际操作中&#xff0c;很多团队面临着协作中的各种障碍。这些障碍不仅影响工作效率&#xff0c;也可能阻碍团队成员之间的合作与信任建设。根据Patrick Lencioni在《团队协作的五大障碍》中的理论&#xff0c;团队协…

基于Java Springboot线上约拍摄影预约微信小程序

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui uniapp 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信开发者工…

消息中间件-Kafka1-实现原理

消息中间件-Kafka 一、kafka简介 1、概念 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以…

使用 Python 中的 TripoSR 根据图像创建 3D 对象

使用 Python 中的 TripoSR 根据图像创建 3D 对象 1. 效果图2. 步骤图像到 3D 对象设置环境导入必要的库设置设备创建计时器实用程序上传并准备图像处理输入图像生成 3D 模型并渲染下载.stl 文件展示结果3. 源码4. 遇到的问题及解决参考这篇博客将引导如何使用Python 及 TripoSR…

【SKFramework框架核心模块】3-3、调试器

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…

03-13、SpringCloud Alibaba第十三章,升级篇,服务降级、熔断和限流Sentinel

SpringCloud Alibaba第十三章&#xff0c;升级篇&#xff0c;服务降级、熔断和限流Sentinel 一、Sentinel概述 1、Sentinel是什么 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保…

QT实战-qt各种菜单样式实现

本文主要介绍了qt普通菜单样式、带选中样式、带子菜单样式、超过一屏幕菜单样式、自定义带有滚动条的菜单样式&#xff0c; 先上图如下&#xff1a; 1.普通菜单样式 代码&#xff1a; m_pmenu new QMenu(this);m_pmenu->setObjectName("quoteListMenu"); qss文…

健康养生生活

在快节奏的现代生活中&#xff0c;健康养生愈发成为人们关注的焦点。它不仅是一种生活方式&#xff0c;更是对生命质量的珍视与呵护。 健康养生&#xff0c;饮食为先。合理的膳食结构是维持身体健康的基石。我们应确保每餐营养均衡&#xff0c;增加蔬菜、水果、全谷物以及优质蛋…

2023年华数杯数学建模B题不透明制品最优配色方案设计解题全过程文档及程序

2023年华数杯全国大学生数学建模 B题 不透明制品最优配色方案设计 原题再现&#xff1a; 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此&#xff0c;不透明制品的配色对其外观美观度和市场竞争力起着重要作用。然而&#xff0c;传统的人工配色存在一定的局限性…

C语言实验 循环结构2

时间:2024.12.3 一、实验 7-1 求符合给定条件的整数集 #include<stdio.h> int main(){int a,b,s,g; scanf("%d",&a);int h=0; for(int i=a;i<=a+3;i++){for(int j=a;j<=a+3;j++){for(int k=a;k<=a+3;k++){if((i!=j)&&(i!=k)&&…

Android10 设备死机的问题分析和解决

最近客户反馈一个问题&#xff0c;设备偶现死机。最后解决&#xff0c;在此记录。 目录 一死机的现象 二死机的类型 三 死机问题分析 1 死机现象的梳理 2 死机日志 1&#xff09;日志分析一 2 日志分析二&#xff08;正确方案&#xff09; 一死机的现象 设备死机&#x…

koa中间件

文章目录 1. koa中间件简介2. 中间件类型1. 应用级中间件2. 路由级中间件3. 错误处理中间件4. 第三方中间件 3.中间件执行流程 1. koa中间件简介 在Koa中&#xff0c;中间件呈现为一个异步函数&#xff0c;该函数支持 async/await 语法&#xff0c;它接收两个参数&#xff1a;…

python学opencv|读取视频(一)灰度视频制作和保存

【1】引言 上一次课学习了用opencv读取图像&#xff0c;掌握了三个函数&#xff1a;cv.imread()、cv.imshow()、cv.imwrite() 相关链接如下&#xff1a; python学opencv|读取图像-CSDN博客 这次课我们继续&#xff0c;来学习用opencv读取视频。 【2】学习资源 首先是官网…

BioDeepAV:一个多模态基准数据集,包含超过1600个深度伪造视频,用于评估深度伪造检测器在面对未知生成器时的性能。

2024-11-29, 由罗马尼亚布加勒斯特大学创建BioDeepAV数据集&#xff0c;它专门设计来评估最先进的深度伪造检测器在面对未见过的深度伪造生成器时的泛化能力&#xff0c;这对于提高检测器的鲁棒性和适应性具有重要意义。 数据集地址&#xff1a;biodeep 一、研究背景&#xff1…

Apache Airflow 快速入门教程

Apache Airflow已经成为Python生态系统中管道编排的事实上的库。与类似的解决方案相反&#xff0c;由于它的简单性和可扩展性&#xff0c;它已经获得了普及。在本文中&#xff0c;我将尝试概述它的主要概念&#xff0c;并让您清楚地了解何时以及如何使用它。 Airflow应用场景 …

【OpenAI库】从0到1深入理解Python调用OpenAI库的完整教程:从入门到实际运用

文章目录 Moss前沿AI一、初识OpenAI API1.1 获取API-Key&#xff08;两种方案&#xff09;1.2 安装OpenAI库 二、Python调用OpenAI API的基础设置2.1 设置API密钥和Base URL2.2 参数详解 三、构建一个简单的聊天应用3.1 创建聊天请求3.2 参数详解3.3 处理响应 四、完整代码示例…