文章目录

  • 一、概述
  • 二、Spring Cache 的使用
    • 2.1 环境搭建
    • 2.2 缓存的读模式 @Cacheable
    • 2.3 自定义缓存配置
    • 2.4 @CachePut
    • 2.5 @CacheEvict 删除缓存
    • 2.6 @Caching 多个操作
  • 三、Spring Cache 的不足

一、概述

常见的缓存的框架有RedisMemcachedGuavaCaffeine等等, 各有各的优势。如果我们的程序想要使用缓存,就要与这些框架耦合。聪明的架构师已经在利用接口来降低耦合了,利用面向对象的抽象和多态的特性,做到业务代码与具体的框架分离。但我们仍然需要显式地在代码中去调用与缓存有关的接口和方法,在合适的时候插入数据到缓存里,在合适的时候从缓存中读取数据。

Spring Cache利用了AOP,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解,就能实现缓存功能了。而且Spring Cache也提供了很多默认的配置,用户可以3秒钟就使用上一个很不错的缓存功能。

二、Spring Cache 的使用

2.1 环境搭建

① 引入Spring Cache坐标依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>

② 配置:使用redis作为缓存

spring:cache:type: redis

③ 开启缓存功能注解:@EnableCaching

通常 Spring Cache 注解都可以用在类上或者方法级别上,如果用在类上,就是对该类的所有 public 方法生效

2.2 缓存的读模式 @Cacheable

@Cacheble注解一般用在查询方法上,表示这个方法有了缓存的功能,方法的返回值会被缓存下来。

  • 如果缓存中有,方法不用调用,如果缓存中没有,才会调用方法
  • key默认自动生成;缓存的名字:SimpleKey [](自主生成的key值)
  • 缓存的value的值。默认使用jdk序列化机制,将序列化后的数据存到redis
  • 默认ttl时间 -1;

测试:

@Cacheable({"category"})
public List<CategoryEntity> getLevel1Categorys() {......
}

我们发现缓存中的数据key就是自动生成的SimpleKey [],值是二进制数据。

2.3 自定义缓存配置

指定生成的缓存使用的key, key属性指定,接受一个SpEL

@Cacheable(value = {"category"},key = "#root.method.name")
public List<CategoryEntity> getLevel1Categorys() {return this.baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid",0));
}

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

spring:cache:redis:time-to-live: 3600000

将数据保存为json格式, 自定义RedisCacheConfiguration即可:

@Configuration
@EnableCaching
public class MyCacheConfig {@BeanRedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){RedisCacheConfiguration config  = RedisCacheConfiguration.defaultCacheConfig();//修改key和value的序列化机制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.prefixKeysWith(redisProperties.getKeyPrefix());}if (!redisProperties.isCacheNullValues()) {config = config.disableCachingNullValues();}if (!redisProperties.isUseKeyPrefix()) {config = config.disableKeyPrefix();}return config;}
}

此时缓存中的数据:

其他配置:

spring:cache:type: redisredis:# 缓存前缀,如果指定了前缀,就用指定的,如果没有,就使用缓存的名字作为前缀key-prefix: CACHE_use-key-prefix: true# 是否缓存null值,防止缓存穿透cache-null-values: true

2.4 @CachePut

加了@CachePut注解的方法,会把方法的返回值put到缓存里面缓存起来,供其它地方使用。它通常用在新增方法上。

2.5 @CacheEvict 删除缓存

缓存的写模式:失效模式

@CacheEvict(value = "category",key = "'getLevel1Categorys'")
public void updateCascade(CategoryEntity category) {......
}

2.6 @Caching 多个操作

    @Caching(evict = {@CacheEvict(value = "category",key = "'getLevel1Categorys'"),@CacheEvict(value = "category",key = "'getCatelogJson'")})public void updateCascade(CategoryEntity category) {......}

三、Spring Cache 的不足

① 读模式

  • 缓存穿透:查询一个null数据,开启缓存空数据配置spring.cache.redis.cache-null-values=true
  • 缓存击穿:大量并发进来查询一个正好过期的数据,解决:加锁
  • 缓存雪崩:大量的key同时过期,解决:加过期时间,spring.cache.redis.time-to-live=3600000

② 写模式:缓存与数据库一致

  • 读写加锁
  • 引入Canal,感知到MySQL的更新去更新数据库
  • 读多写多,直接去数据库查询就行

Spring Cache的基本使用相关推荐

  1. SpringBoot第十三篇:springboot集成spring cache

    本文介绍如何在springboot中使用默认的spring cache, 声明式缓存 Spring 定义 CacheManager 和 Cache 接口用来统一不同的缓存技术.例如 JCache. E ...

  2. 学习笔记:cache 和spring cache 技术(1)

    title: 学习笔记:cache 和spring cache 技术(1) author: Eric liu tags: [] categories: hexo 缓存是实际工作中非常常用的一种提高性能 ...

  3. spring Cache /Redis 缓存 + Spring 的集成示例

    spring Cache https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ spring+redis 缓存 ht ...

  4. java清空redis缓存数据库_java相关:Spring Cache手动清理Redis缓存

    java相关:Spring Cache手动清理Redis缓存 发布于 2020-4-24| 复制链接 摘记: 这篇文章主要介绍了Spring Cache手动清理Redis缓存,文中通过示例代码介绍的非 ...

  5. 注释驱动的 Spring cache 缓存介绍--转载

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

  6. Spring Cache抽象-基于XML的配置声明(基于EhCache的配置)

    概述 完整示例 pomxml增加依赖 数据库表数据Oracle 实体类 服务层 ehcache的配置文件 Spring-EhCache配置文件 单元测试 日志输出 日志分析 示例源码 概述 首先请阅读 ...

  7. Spring Cache抽象-基于XML的配置声明(基于ConcurrentMap的配置)

    概述 示例 项目结构 数据库表数据Oracle 实体类 服务层 Spring配置文件 单元测试 日志输出 日志分析 示例源码 概述 Spring Cache基于注解的配置 如果不想使用注解或者由于其他 ...

  8. Spring Cache抽象-使用SpEL表达式

    概述 SpEl表达式 概述 在Spring Cache注解属性中(比如key,condition和unless),Spring的缓存抽象使用了SpEl表达式,从而提供了属性值的动态生成及足够的灵活性. ...

  9. Spring Cache抽象-缓存管理器

    概述 SimpleCacheManager NoOpCacheManager ConcurrentMapCacheManager CompositeCacheManager 概述 CacheManag ...

  10. Spring Cache抽象-使用Java类注解的方式整合EhCache

    概述 工程结构 源码 概述 Spring Cache抽象-之缓存注解这篇博文中我们介绍了SpringCache抽象注解的使用方式 既然这是一个抽象,我们需要一个具体的缓存存储实现.比价流行的有:基于J ...

最新文章

  1. 理解委托(delegate)及为什么要使用委托
  2. [算法系列之二十六]字符串匹配之KMP算法
  3. mysql数据库集群备份策略_mysql高可用方案之集群(cluster)
  4. php iis session 超时设置,如何配置IIS Session超时时间
  5. [LeetCode] 144. Binary Tree Preorder Traversal Java
  6. 常见鸟的种类及特点_常见乌龟的品种及图片大全!
  7. 内存池的设计和实现总结(一)
  8. Android8.1 Camera2+HAL3之HIDL open()流程(二十)
  9. Java集合详解2:LinkedList和Queue
  10. mssql差异备份获得的webshell的个人体会
  11. 中文版-动手学深度学习
  12. Java机器学习库(Java ML)(一、分类)
  13. linux ftp client安装,Linux 离线安装 FTP客户端
  14. left join一对多只保留一条结果的解决方法
  15. mysql中如何统计数据_mysql中的数据统计方法
  16. 头条抖音后端技术3面,2021Java通用流行框架大全,含面试题+答案
  17. VS2019 MFC模式下如何调用控制台并用cprintf在控制台打印
  18. vim加载systemverilog语法高亮
  19. Windows提权基本原理,各位表哥了解下!
  20. office online server2016详细安装步骤及问题总结

热门文章

  1. .ren助力莘莘学子,paperpass.ren让论文“检测去重”一步到位!
  2. 2018之江杯全球人工智能大赛
:零样本图像目标识别 baseline 全部代码+注释+招队友
  3. 编写简单的WEB服务器
  4. 电脑滴滴滴响三声无法进入系统
  5. Python线性规划
  6. STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样频率可变+显示波形(详细解读)
  7. Web前端学习:jQuery基础--3【jquery操作样式类名、添加元素、jQuery-CSS()方法】
  8. CCF-CSP真题《202206-3—角色授权》思路+python题解
  9. python登录邮箱#183;
  10. 找到两个字符串重合的部分