当前位置: 首页 > news >正文

Springboot 自定义缓存配置 CacheManager 及redis集成

目录

前言

集成

maven依赖

CacheManagerConfig配置

redis配置

使用

Springboot 集成使用缓存

@Cacheable

@CacheEvict


前言

现有项目中经常遇到的缓存集成问题,Springboot提供了统一的接口抽象与缓存管理器,可集成多种缓存类型,如  ConcurrentMap 缓存、redis缓存,并可以随时无缝替换底层缓存存储。

集成

maven依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.3.0</version>
</dependency>

CacheManagerConfig配置

下面配置了2个,一个是localCacheManager,底层用的是ConcurrentMap,另一个是 RedisCacheManager,底层用的是redis。

通过 @Primary 注解,可以控制那个是主缓存。

@Configuration
@EnableCaching
@EnableConfigurationProperties(CacheProperties.class)
public class CacheManagerConfig {public static final String CACHE_MANAGER_LOCAL = "localCacheManager";public static final String CACHE_MANAGER_REDIS = "redisCacheManager";@Autowiredprivate CacheProperties cacheProperties;@Bean(name = CACHE_MANAGER_LOCAL)public CacheManager localCacheManager() {return new ConcurrentMapCacheManager();}@Primary@Bean(name = CACHE_MANAGER_REDIS)public RedisCacheManager redisCacheManager() {GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(cacheProperties.getRedis().getTimeToLive()).serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer));return RedisCacheManager.builder(jedisConnectionFactory()).cacheDefaults(config).build();}
}

redis配置

配置文件

spring:redis:host: 192.168.1.252port: 6379database: 1password: 123456cache:redis:time-to-live: 600s

redisconfig

    /*** jedis连接工厂* @return*/@Beanpublic JedisConnectionFactory jedisConnectionFactory() {RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();redisStandaloneConfiguration.setDatabase(redisProperties.getDatabase());redisStandaloneConfiguration.setPort(redisProperties.getPort());redisStandaloneConfiguration.setHostName(redisProperties.getHost());redisStandaloneConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword()));JedisConnectionFactory factory = new JedisConnectionFactory(redisStandaloneConfiguration);return factory;}

redisTemplate

 @Bean(name = "redisTemplate")public RedisTemplate<String, Object> redisTemplate() {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(jedisConnectionFactory());Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();redisTemplate.setDefaultSerializer(genericJackson2JsonRedisSerializer);objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}

使用

注入cacheManager,并使用

    @Autowiredprivate CacheManager cacheManager;public void test() {Cache ca = cacheManager.getCache("userCache");ca.put("key", "value");ca.get("key");}

Springboot 集成使用缓存

@Cacheable

注解为 

@Cacheable 标记当前方法, 可将数据缓存与缓存,一般用于查询类方法

    @Cacheable(value = "firm", key = "#id", condition="#id!=null")public FirmBo getFirm(Long id) {return get(id);}

@CacheEvict

销毁缓存,一般用于编辑、新增或删除时候销毁缓存,下次查询时,会重新走数据库

​@CacheEvict(value = "person", key = "#person.id", condition = "#person.id!=null")public PersonBo savePerson(PersonBo person) {save(person);}

redis缓存存储实例

相关文章:

Springboot 自定义缓存配置 CacheManager 及redis集成

目录 前言 集成 maven依赖 CacheManagerConfig配置 redis配置 使用 Springboot 集成使用缓存 Cacheable CacheEvict 前言 现有项目中经常遇到的缓存集成问题&#xff0c;Springboot提供了统一的接口抽象与缓存管理器&#xff0c;可集成多种缓存类型&#xff0c;如 Co…...

JS 中七个改变原数组的方法

目录 一、push 二、pop 三、unshift 四、shift 五、splice 六、sort 七、reverse 一、push 在数组的尾部添加元素&#xff0c;并返回新的长度。 let arr [1] arr.push(2) console.log(arr) // [1, 2] 二、pop 删除数组最后面一个元素、并返回删除的元素。 let arr [1, …...

【笔试强训选择题】Day7.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…...

Vue电商项目--axios二次封装

postman测试接口 刚刚经过postman工具测试&#xff0c;发现接口果然发生了改变。 新的接口为http://gmall-h5-api.atguigu.cn 如果服务器返回的数据code字段200&#xff0c;代表服务器返回数据成功 整个项目&#xff0c;接口前缀都有/api字样 axios二次封装 XmlHttpRequ…...

人生四维度

人生四维度 不是有钱了就成功&#xff0c;你知道&#xff1b;人生的成功不止一种&#xff0c;你也知道。但成功还有哪种&#xff1f;你知道吗&#xff1f; 如果把人生的体验展开&#xff0c;我们可以得到四个维度&#xff0c;高度、深度、宽度和温度。 财富、权力、影响力 构…...

Python 调用 MessageBeep 播放系统音效

Python 调用 MessageBeep 播放 Windows 系统提示声音 Windows API 函数 "MessageBeep" 介绍 "Windows API MessageBeep"是一个用于发出系统提示音效的函数。它可以向用户发出一种预定义的声音&#xff0c;以指示事件的发生或某个条件的满足。例如&#xf…...

废物,我TMD一个985却斗不过专科生(大厂自动化测试2年被裁)

前言 看到标题&#xff0c;可能很多读者朋友恐怕又要骂我了&#xff0c;985这个特殊的字眼也确实异常晃眼&#xff0c;实际上现在985&#xff0c;211也越来越多&#xff0c;它能代表你能够进入到更高的平台&#xff0c;拿到“高级工厂”的入场券&#xff0c;但并不意味着你会成…...

p70 内网安全-域横向内网漫游 Socks 代理隧道技术(NPS、FRP、CFS 三层内网漫游)

数据来源 本文仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 ​ 必要基础知识点&#xff1a; 内外网简单知识内网 1 和内网 2 通信问题正向反向协议通…...

第三十二章 Unity Mecanim动画系统(上)

在上一章节中&#xff0c;我们介绍了Unity的旧版动画系统&#xff0c;本章节来介绍新版的Mecanim动画系统。新版的Mecanim动画系统实际是对旧版动画系统的升级。新版的Mecanim动画系统仍然是建立在动画片段的基础上的&#xff0c;只不过它给我们提供了一个可视化的窗口来编辑动…...

第二章 集合

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…...

这一篇Databinding应该可以帮助迅速上手吧

Databinding使用篇&#xff08;迅速上手&#xff09; 使用前需要在模块级别的build.gradle里面的android闭包里添加&#xff1a; dataBinding{enabled true}接着在layout文件中按下Alt 回车&#xff0c; 将布局转换成data binding layout即可&#xff0c;此时编译就会生成对…...

【PHP在线定制商城网站源码V3.0】开源的DIY在线定制商城系统+在线礼品定制

源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/87637177 PHP在线定制商城网站源码&#xff0c;免费开源、免费下载。本商城基于mycncart开发。安装成功后即可浏览&#xff0c;你可以在后台->安装扩展功能上传安装插件&#xff0c;在代码调整中点击刷…...

cout源码浅析

目录 cout源码浅析 那么对于没有定义在这之中的要怎么办呢&#xff1f; 实际使用 结语 首先来看我从cplusplus中截取的这张图&#xff1a; 注意最下面这一行字。cout其实是ostream的一个标准对象object。而上面则演示了一些继承关系。 好的&#xff0c;理解了之后&#xf…...

发送Ajax get请求详解

发送AJAX get请求&#xff0c;前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>ajax get请求</title> </head> <body> <script type"text/java…...

SQL语句

创建及删除数据库和表 CREATE DATABASE 数据库名; CREATE DATABASE school; 创建新的表 CREATE TABLE 表名(字段1 数据类型,字段2 数据类型[,...] [,PRIMARY KEY (主键名)]); #主键一般选择能代表唯一性的字段&#xff0c;不允许取空值(NULL)&#xff0c;值也不允许重复&…...

Mysql 学习(八)单表查询方法二

复杂查询 上一节说了5种访问类型的查询&#xff0c;这一节就来说说关于这些比较复杂的查询 情况一&#xff1a;多个二级索引查询 sql&#xff1a;SELECT * FROM index_value_table WHERE value1 abc AND value2 > 1000;搜索条件&#xff1a; value1 等于 abcvalue2 大于…...

安卓系统下的截屏和录屏

可以抓取手机屏幕画面&#xff08;屏幕截图&#xff09;&#xff0c;也可以录制屏幕画面视频。拍摄屏幕后&#xff0c;可以查看、编辑和分享所拍的图片或视频。 抓取屏幕截图 打开要抓取的屏幕。视手机情况执行下列一个操作&#xff0c;3种方法看你手机有效的&#xff1a; 同…...

行为型模式-中介者模式

中介者模式 概述 一般来说&#xff0c;同事类之间的关系是比较复杂的&#xff0c;多个同事类之间互相关联时&#xff0c;他们之间的关系会呈现为复杂的网状结构&#xff0c;这是一种过度耦合的架构&#xff0c;即不利于类的复用&#xff0c;也不稳定。例如在下左图中&#xf…...

辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-功能ODD定义

1.系统定义 智能驾驶系统包含行车场景功能和泊车场景功能,行车场景功能包括安全ADAS功能、基础ADAS功能和高阶ADAS功能三大类,本文档定义高阶ADAS功能中的导航辅助驾驶功能用例。 1.1.高阶ADAS功能列表 功能需求ID 功能分类 功能名称...

PMP/高项 06-项目成本管理

项目成本管理 概念 项目成本管理 项目成本管理又被称为项目造价管理&#xff0c;是有关项目成本和项目价值两个方面的管理&#xff0c;是为保障以最小的成本实现最大的项目价值而开展的项目专项管理工作。 确保在批准的项目预算内完成项目 成本管理内容 规划成本管理 制定项目…...

STM32模拟UART实现技术详解

基于STM32的UART模拟实现技术解析1. UART通信基础原理1.1 异步串行通信基础通用异步收发器(UART)作为一种经典的串行通信方式&#xff0c;通过逐位传输实现数据通信。其核心优势在于传输线少、成本低&#xff0c;但相对并行通信速度较慢。异步通信模式下&#xff0c;收发双方的…...

ChatGPT工作原理简述:从Transformer到AI辅助开发的实践指南

作为一名开发者&#xff0c;你可能已经无数次地与ChatGPT进行过对话&#xff0c;惊叹于它流畅的文本生成能力&#xff0c;并将其API集成到自己的项目中。但你是否曾好奇&#xff0c;这个强大的“大脑”究竟是如何工作的&#xff1f;更重要的是&#xff0c;在激动人心的AI辅助开…...

逻辑回归毕设效率优化实战:从特征工程到推理加速的全流程提速方案

最近在帮学弟学妹们看逻辑回归相关的毕业设计&#xff0c;发现一个普遍问题&#xff1a;大家把重点都放在了模型原理上&#xff0c;但代码一跑起来&#xff0c;训练慢、预测卡&#xff0c;整个流程效率低下&#xff0c;非常影响实验进度和最终演示效果。其实&#xff0c;逻辑回…...

论人机协同中的模糊性与不确定性

在人工智能从"工具辅助"向"智能伙伴"演进的过程中&#xff0c;人机协同正突破传统"人主导-机执行"的单向模式&#xff0c;形成双向认知交互的新型协作关系。这种关系的复杂性远超简单的人机分工——人类认知的模糊性&#xff08;Fuzziness&#…...

FastLED NeoMatrix:嵌入式LED矩阵的GFX抽象与硬件加速融合框架

1. FastLED NeoMatrix&#xff1a;面向嵌入式显示系统的高性能LED矩阵驱动框架FastLED NeoMatrix 是一个专为嵌入式平台设计的、与 Adafruit_GFX 兼容且深度适配 FastLED 生态的 LED 矩阵显示库。它并非简单复刻&#xff0c;而是对原有 Adafruit_NeoMatrix 库的一次底层重构与性…...

Ubuntu 22.04 下 Intel N5095 核显驱动与 Jellyfin 硬解全攻略

1. 为什么需要升级内核与驱动&#xff1f; 很多朋友在Ubuntu 22.04上使用Intel N5095处理器搭建家庭媒体服务器时&#xff0c;都会遇到视频播放卡顿的问题。这主要是因为系统默认的5.15内核存在一个关键bug&#xff0c;导致11代Intel处理器的核显硬件解码功能无法正常工作。我刚…...

【2026年小红书春招- 3月25日 -第三题- 字符置换】(题目+思路+JavaC++Python解析+在线测试)

题目内容 为了提升小红书笔记标签的可读性,我们计划对标签字符串进行一次双向字符置换操作,以获得更小的字典序结果。 具体地,给定一个长度为 nnn 的字符串 sss(下标从 $1 开始),你可以进行一次如下操作:选取三个整数开始),你可以进行一次如下操作: 选取三个整数...

【2026年小红书春招- 3月25日 -第二题- 互评操作】(题目+思路+JavaC++Python解析+在线测试)

题目内容 现在有 n n n 条$ Plog$ 在首页上排成一列,队尾在下侧,队头在上侧。 用长度为 n n n 的$ 01 $串 s = s 1 , s 2 , … , s n s=s_1,s_2,…,s_n...

SEO_10个提升网站排名的SEO优化技巧分享(80 )

SEO优化技巧&#xff1a;提升网站排名的10个秘诀 在当今竞争激烈的互联网市场中&#xff0c;网站的排名直接关系到它的流量和商业成功。SEO&#xff08;搜索引擎优化&#xff09;技巧的掌握能够显著提升网站在搜索引擎中的曝光度。本文将分享十个提升网站排名的SEO优化技巧&…...

Phi-4-Reasoning-Vision惊艳案例:模糊低质图中关键信息增强与可信度评估

Phi-4-Reasoning-Vision惊艳案例&#xff1a;模糊低质图中关键信息增强与可信度评估 1. 专业级多模态推理工具 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具&#xff0c;专为双卡4090环境优化。这个工具严格遵循官方SYSTEM …...