【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis
目录
- 【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis
- 什么是缓存抽象
- 声明式注解
- JSR-107对应
- SpEL上下文数据
- 引入依赖
- cache 支持的缓存类型
- 缓存类型配置
- NONE
- SIMPLE
- REDIS
- 自定义配置
- CAFFEINE
- Hazelcast
- ...
- 总结
个人主页: 【⭐️个人主页】
需要您的【💖 点赞+关注】支持 💯
【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis
📖 本文核心知识点:
- spring cache 抽象和注解
- cache 支持的缓存类型
- spring cache + spring data redis 配置
- redis序列化
本章使用的spring版本
spring boot version: 3.1.5
什么是缓存抽象
- 官网-缓存抽象
使用翻译软件阅读 - 主要阅读的知识点
- 缓存抽象的作用
- spring缓存的声明式注解
- spring缓存的生成key策略和如何自定义keyGenerator
- 缓存支持的后端类型
声明式注解
| Spring 缓存注解 | 说明 |
|---|---|
@Cacheable | 触发缓存填充。 |
@CacheEvict | 触发缓存退出。 |
@CachePut | 在不干扰方法执行的情况下更新缓存。 |
@Caching | 将多个缓存操作重新组合到一个方法上。 |
@CacheConfig | 在类级别共享一些常见的与缓存相关的设置。 |
JSR-107对应
| Spring 缓存注解 | JSR-107 | 备注 |
|---|---|---|
@Cacheable | @CacheResult | 相当相似。 可以缓存特定的异常并强制 无论缓存的内容如何,都执行该方法。@CacheResult |
@CachePut | @CachePut | 当 Spring 使用方法调用的结果更新缓存时,JCache 要求将其作为注释的参数传递。 由于这种差异,JCache 允许在 实际方法调用。@CacheValue |
@CacheEvict | @CacheRemove | 相当相似。 支持有条件逐出,当 方法调用会导致异常。@CacheRemove |
@CacheEvict(allEntries=true) | @CacheRemoveAll | 看。@CacheRemove |
@CacheConfig | @CacheDefaults | 允许您以类似的方式配置相同的概念。 |
SpEL上下文数据
| 名称 | 位置 | 描述 | 示例 |
|---|---|---|---|
| methodName | root对象 | 当前被调用的方法名 | #root.methodname |
| method | root对象 | 当前被调用的方法 | #root.method.name |
| target | root对象 | 当前被调用的目标对象实例 | #root.target |
| targetClass | root对象 | 当前被调用的目标对象的类 | #root.targetClass |
| args | root对象 | 当前被调用的方法的参数列表 | #root.args[0] |
| caches | root对象 | 当前方法调用使用的缓存列表 | #root.caches[0].name |
| Argument Name | 执行上下文 | 当前被调用的方法的参数,如findArtisan(Artisan artisan),可以通过#artsian.id获得参数 | #artsian.id |
| result | 执行上下文 | 方法执行后的返回值(仅当方法执行后的判断有效,如 unless cacheEvict的beforeInvocation=false) | #result |
引入依赖
implementation 'org.springframework.boot:spring-boot-starter-cache'
添加启用缓存注解@EnableCaching
@SpringBootApplication(scanBasePackages = {"com.kongxiang"})
@EnableAutoConfiguration
@EnableCaching
public class StudySpring3Application {public static void main(String[] args) {SpringApplication.run(StudySpring3Application.class, args);}
}
cache 支持的缓存类型
spring cache支持的缓存类型
查看类org.springframework.boot.autoconfigure.cache.CacheType
public enum CacheType {/*** Generic caching using 'Cache' beans from the context.*/GENERIC,/*** JCache (JSR-107) backed caching.*/JCACHE,/*** Hazelcast backed caching.*/HAZELCAST,/*** Couchbase backed caching.*/COUCHBASE,/*** Infinispan backed caching.*/INFINISPAN,/*** Redis backed caching.*/REDIS,/*** Cache2k backed caching.*/CACHE2K,/*** Caffeine backed caching.*/CAFFEINE,/*** Simple in-memory caching.*/SIMPLE,/*** No caching.*/NONE}
缓存类型配置
NONE
无缓存
spring:cache:type: NONE
SIMPLE
内存缓存
spring:cache:type: SIMPLE

REDIS
Redis 缓存
spring:cache:type: REDISdata:redis:host: '127.0.0.1'username:port: 6379password:database: 1lettuce:pool:enabled: truemax-active: 8max-wait: 1000max-idle: 8connect-timeout: 5000
自定义配置
默认情况下会有两个模板类被注入Spring IoC供我们使用,需要个性化配置来满足实际的开发。
一个是RedisTemplate<Object, Object>,主要用于对象缓存,其默认使用JDK序列化,我们需要更改其序列化方式解决一些问题,比如Java 8日期问题、JSON序列化问题。需要我们重写一下。
- RedisTemplate自定义配置
@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 使用Jackson2JsonRedisSerialize 替换默认序列化Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = initJacksonSerializer();// 设置value的序列化规则和 key的序列化规则template.setValueSerializer(jackson2JsonRedisSerializer);template.setKeySerializer(new StringRedisSerializer());template.afterPropertiesSet();return template;}/*** 处理redis序列化问题* @return Jackson2JsonRedisSerializer*/private Jackson2JsonRedisSerializer<Object> initJacksonSerializer() {ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);//以下替代旧版本 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);om.activateDefaultTyping(om.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);//bugFix Jackson2反序列化数据处理LocalDateTime类型时出错om.disable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS);// java8 时间支持om.registerModule(new JavaTimeModule());return new Jackson2JsonRedisSerializer<>(om,Object.class);}
- 缓存管理器自定义配置
使用Spring Cache做缓存的时候,有针对不同的key设置不同过期时间的场景。比如Jwt Token我想设置为一周过期,而验证码我想设置为五分钟过期。这个怎么实现呢?需要我们个性化配置RedisCacheManager。首先我通过枚举来定义这些缓存及其TTL时间
我们通过向Spring IoC分别注入RedisCacheConfiguration和RedisCacheManagerBuilderCustomizer来个性化配置
/*** Redis cache configuration.** @param redisTemplate the redis template* @return the redis cache configuration*/@Beanpublic RedisCacheConfiguration redisCacheConfiguration(RedisTemplate<Object, Object> redisTemplate, CacheProperties cacheProperties) {// 参见 spring.cache.redisCacheProperties.Redis redisProperties = cacheProperties.getRedis();RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()// 缓存的序列化问题.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));if (redisProperties.getTimeToLive() != null) {// 全局 TTL 时间redisCacheConfiguration = redisCacheConfiguration.entryTtl(redisProperties.getTimeToLive());}if (redisProperties.getKeyPrefix() != null) {// key 前缀值redisCacheConfiguration = redisCacheConfiguration.prefixCacheNameWith(redisProperties.getKeyPrefix());}if (!redisProperties.isCacheNullValues()) {// 默认缓存null值 可以防止缓存穿透redisCacheConfiguration = redisCacheConfiguration.disableCachingNullValues();}if (!redisProperties.isUseKeyPrefix()) {// 不使用key前缀redisCacheConfiguration = redisCacheConfiguration.disableKeyPrefix();}return redisCacheConfiguration;}/*** Redis cache manager 个性化配置缓存过期时间.** @return the redis cache manager builder customizer*/@Beanpublic RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer(RedisCacheConfiguration redisCacheConfiguration) {return builder -> builder.cacheDefaults(redisCacheConfiguration);}
CAFFEINE
引入依赖
implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8'
修改配置
spring:cache:type: CAFFEINE
直接启动即可
Hazelcast
…
总结
spring cache 缓存抽象加上spring data包和spring boot autoconfig 配置包的能力,可以快速接入一个具体的缓存实现。redis是我们公司基本使用的缓存策略。所以针对redis的一些自定义配置,通过 java bean的方式实现。着重强调一下。
相关文章:
【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis
目录 【7】Spring Boot 3 集成组件:缓存组件 spring cache spring data redis什么是缓存抽象声明式注解JSR-107对应SpEL上下文数据 引入依赖cache 支持的缓存类型缓存类型配置NONESIMPLEREDIS自定义配置 CAFFEINE Hazelcast...总结 个人主页: 【⭐️个人主页】 需要…...
说说Java中的不可重入锁
什么是锁? 简单来讲在Java中,锁是一种用于并发控制的机制,用于保护共享资源,防止多个线程同时访问或修改数据导致的数据不一致性和线程安全问题。在Java虚拟机(JVM)中,每个对象都有一个相关联的…...
C++学习 --vector
目录 1, 什么是vector 2, 创建vector 2-1, 标准数据类型 2-2, 自定义数据类型 2-3, 其他创建方式 3, 操作vector 3-1, 赋值 3-2, 添加元素 3-2-1, 添加元素(assi…...
Android图片涂鸦,Kotlin(1)
Android图片涂鸦,Kotlin(1) import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.graphics.PointF import android.…...
upload-labs(1-17关攻略详解)
upload-labs pass-1 上传一个php文件,发现不行 但是这回显是个前端显示,直接禁用js然后上传 f12禁用 再次上传,成功 右键打开该图像 即为位置,使用蚁剑连接 连接成功 pass-2 源码 $is_upload false; $msg null; if (isse…...
《 机器人基础 》期末试卷(A)
一、填空题(30分,每空2分) 1. 按照相机的工作方式,机器人常用相机分为1)__ 单目摄像头 2)__ 双目摄像头 _ 3)_深度摄像头_ 三类。 2. 度量地图强调…...
Azure Machine Learning - Azure AI 搜索中的矢量搜索
矢量搜索是一种信息检索方法,它使用内容的数字表示形式来执行搜索方案。 由于内容是数字而不是纯文本,因此搜索引擎会匹配与查询最相似的矢量,而不需要匹配确切的字词。本文简要介绍了 Azure AI 搜索中的矢量支持。 其中还解释了与其他 Azure…...
3 redis实现一个消息中间件
使用list实现一个队列,可以从左侧入队,也可以从右侧入对 即可以从左侧读取,也可以从右侧读取 1、Lindex Lindex 命令用于通过索引获取列表中的元素 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的…...
js添加dom到指定div之后,并给添加的dom类名,然后设置其样式,以及el-popover层级z-index过高问题解决。
遇到一个需求,Vue项目做一个表格,要求表头与表格内容分开,如下效果所示,表头与表格有个高度间隔边距(箭头所示),因为默认我们的el-table的表头与内容是一起的: 思路:通过querySelector获取el-table__header-wrapper元素,通过createElement创建一个div,通过 newElem…...
C语言结构体
#include <stdio.h> #include <string.h> #include <stdlib.h>//struct Student_s { // int num; // char name[20]; // char gender; // int age; // float Chinese; // float Math; // float English; // char addr[30]; //}; //最后的分号一定要写&#x…...
【Python大数据笔记_day10_Hive调优及Hadoop进阶】
hive调优 hive官方配置url: Configuration Properties - Apache Hive - Apache Software Foundation hive命令和参数配置 hive参数配置的意义: 开发Hive应用/调优时,不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率,或帮助定位问…...
React经典初级错误
文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者,我们创造bug,传播bug,毫不留情地消灭bug,在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案,感兴…...
C# System.Array.CopyTo() 和 System.Array.Clone() 有什么区别
System.Array.CopyTo() 和 System.Array.Clone() 是用于数组复制的两种不同方法,它们在实现和用途上有一些区别。 System.Array.CopyTo() 方法: CopyTo() 方法用于将数组的元素复制到另一个数组。它是 Array 类的实例方法,可以用于复制一个…...
Stable Diffusion 启动时 got an unexpected keyword argument ‘socket_options‘ 错误解决
Stable Diffusion 启动时 got an unexpected keyword argument socket_options 错误解决 问题解决方法 问题 Launching Web UI with arguments: Traceback (most recent call last):File "launch.py", line 48, in <module>main()File "launch.py"…...
CSS 文本属性篇
文字颜色 属性名:color作用:控制文字的颜色可选值: 1.颜色名 color: blue; 2.rgb或rgba color:rgb(132, 220, 254); color:rgba(132, 220, 254,0.5); 3.hex或hexa(十六进制) color:#0078d4; color:#0078d48b; 4.hsl或h…...
Activiti,Apache camel,Netflex conductor对比,业务选型
Activiti,Apache camel,Netflex conductor对比,业务选型 1.activiti是审批流,主要应用于人->系统交互,典型应用场景:请假,离职等审批 详情可见【精选】activti实际使用_activiti通过事件监听器实现的优势_记录点滴…...
pythom导出mysql指定binlog文件
要求 要求本地有py环境和全局环境变量 先测试直接执行binlog命令执行命令 Windows 本地直接执行命令 # E:\output>E:\phpstudy_pro\Extensions\MySQL5.7.26\bin\mysqlbinlog binglog文件地址 # --no-defaults 不限制编码 # -h mysql链接地址 # -u mysql 链接名称 # -p m…...
TDengine 跨版本迁移实战
TDengine 3.0 已经退出了近一年,目前已经到了 3.2 版本。很遗憾的是 2.x 和 3.x 之间的数据文件不兼容。 如果向从 2.x 升级到 3.x 只能选择数据迁移的方式。 目前数据迁移有三种方法: 使用官方推荐工具 taosx。使用 taosdump 工具。自己写程序。 迁移…...
FPGA设计时序约束八、others类约束之Set_Case_Analysis
目录 一、序言 二、Set Case Analysis 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考资料 一、序言 在Vivado的时序约束窗口中,存在一类特殊的约束,划分在others目录下,可用于设置忽略或修改默认的时序…...
xftp连接wsl2
在WSL中默认是没有安装OpenSSH,需要自己安装。 安装 sudo apt update sudo apt install openssh-server检查是否安装成功 ssh -V配置ssh sudo vim /etc/ssh/ssh_config设置端口 Port 22启动ssh服务 sudo service ssh startxftp连接 主机地址:127.…...
2026年Turnitin AI检测对留学生论文的影响:检测标准和应对方案
2026年Turnitin AI检测对留学生论文的影响:检测标准和应对方案 同一篇论文,知网52%,维普38%,万方21%。 为什么差这么多?不是平台乱搞,而是检测算法和判断标准不一样。理解了Turnitin AI检测背后的逻辑&am…...
如何5分钟配置绝区零全自动智能助手:释放游戏时间的终极指南
如何5分钟配置绝区零全自动智能助手:释放游戏时间的终极指南 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 还…...
HardSourceWebpackPlugin源码解析:从入口到缓存写入的完整流程
HardSourceWebpackPlugin源码解析:从入口到缓存写入的完整流程 【免费下载链接】hard-source-webpack-plugin 项目地址: https://gitcode.com/gh_mirrors/ha/hard-source-webpack-plugin HardSourceWebpackPlugin是一个为Webpack构建过程提供持久化缓存的插…...
教育资源数字化转型:tchMaterial-parser电子课本获取工具深度解析
教育资源数字化转型:tchMaterial-parser电子课本获取工具深度解析 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。…...
17. 杠杆平衡条件探究
6. 杠杆平衡条件探究 功能介绍: 通过动态交互演示杠杆的平衡条件 (F1L1=F2L2F_1L_1 = F_2L_2F1...
CogVideoX-2b作品集:这些流畅自然的视频都是用文字生成的
CogVideoX-2b作品集:这些流畅自然的视频都是用文字生成的 当文字能够直接转化为流畅自然的视频,创作的门槛将被彻底打破。CogVideoX-2b作为智谱AI开源的文字生成视频工具,正在让这一愿景成为现实。本文将展示一系列由该模型生成的惊艳视频作…...
Hunyuan-OCR-WEBUI新手入门:3步搞定复杂文档文字识别
Hunyuan-OCR-WEBUI新手入门:3步搞定复杂文档文字识别 1. 引言:为什么选择Hunyuan-OCR-WEBUI? 在日常工作和学习中,我们经常会遇到需要从图片或PDF中提取文字的场景。无论是扫描的合同、手写的笔记,还是复杂的表格文档…...
多模态学习避坑指南:当你的模型出现‘模态懒惰‘时该怎么办?
多模态学习避坑指南:当你的模型出现模态懒惰时该怎么办? 在构建多模态AI系统时,工程师们常常遇到一个棘手问题:模型看似融合了多种数据源,实际表现却不如单模态模型。这种现象被学术界称为"模态懒惰"(Modali…...
实时流程图编辑的现代化解决方案:Mermaid Live Editor如何提升技术文档效率
实时流程图编辑的现代化解决方案:Mermaid Live Editor如何提升技术文档效率 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me…...
GLM-4.1V-9B-Base算法应用:融合LSTM时序预测的智能视频内容分析平台
GLM-4.1V-9B-Base算法应用:融合LSTM时序预测的智能视频内容分析平台 1. 引言:当视频分析遇上多模态AI 想象一下这样的场景:一个商场监控室里,安保人员需要同时盯着几十个监控画面;或者一个短视频平台的内容审核团队&…...
