【SpringBoot3】Spring Boot 3.0 集成 Redis 缓存

文章目录

  • 一、什么是redis缓存
  • 二、SpringBoot3 如何集成 Redis
  • 三、spring-boot-starter-cache 结合 Redis 使用
    • 1、什么是 spring-boot-starter-cache
    • 2、Redis 集成步骤
    • 3、使用示例
  • 参考

一、什么是redis缓存

Redis缓存是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它主要用于作为数据库、缓存和消息中间件,以快速读写和丰富的数据结构支持而著称。

在应用程序和数据库之间,Redis缓存作为一个中间层起着关键作用。通过将常用的数据存储在Redis内存中,可以快速读取,从而避免了从数据库进行复杂的查询操作,减轻了数据库服务器的压力,并提高了应用程序的性能和响应速度。

此外,为了优化热门查询的性能,可以确定希望缓存的查询结果,特别是最常用和最耗时的查询。这样可以进一步提高应用程序的性能和吞吐量。

spring-boot-starter-data-redis默认的Redis客户端是Lettuce。这是因为Lettuce是一个线程安全的、基于Netty通信的Redis客户端,相比之下,Jedis在多线程环境下存在线程安全问题,因此需要增加连接池来解决线程安全的问题,同时可以限制redis客户端的数量。

而Lettuce在多线程环境下不存在线程安全问题,一个连接实例就可以满足多线程环境下的并发访问,当然实例不够的情况下也可以按需增加实例,保证伸缩性。因此,Spring Boot在后续版本中选择了Lettuce作为默认的Redis客户端。

二、SpringBoot3 如何集成 Redis

1)添加依赖

在pom.xml文件中添加Spring Boot Starter Data Redis依赖:

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

2)配置Redis连接

在application.properties或application.yml文件中配置Redis连接信息:

spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
spring.data.redis.database=0
spring.data.redis.password=

3)配置 RedisTemplate Bean

@Configuration  
public class RedisConfig {  @Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);template.setValueSerializer(serializer);template.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(serializer);return template;}
}

4)使用示例

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
public class RedisTemplateTest {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Testvoid test() {redisTemplate.opsForValue().set("key_name", "my name is Jacky");System.out.println("缓存设置成功");String value = (String) redisTemplate.opsForValue().get("key_name");System.out.println(value);}
}

三、spring-boot-starter-cache 结合 Redis 使用

1、什么是 spring-boot-starter-cache

Spring Boot Starter Cache 是 Spring Boot 体系内提供使用 Spring Cache 的 Starter 包。它可以为你的 Spring Boot 应用提供缓存支持,简化和自动化缓存的配置和识别。通过使用 Spring Cache 的抽象层,开发者可以轻松地使用各种缓存解决方案。

Spring Boot Starter Cache 集成了各种主流缓存实现(ConcurrentMapredisehcacheCaffeine等)

Spring Boot Starter Cache 默认使用ConcurrentMap作为缓存;如果工程中引入了redis配置,则会使用redis作为缓存

Spring Boot Starter Cache 通过CacheManager判断具体使用哪个缓存,每个缓存都有一个具体的CacheManager(比如:EhCacheCacheManagerRedisCacheManagerCaffeineCacheManager),如果没有配置任何的CacheManager,则会使用ConcurrentMap作为缓存

常用注解说明:

名称说明
@EnableCaching开启基于注解的缓存
@CacheConfig统一配置本类的缓存注解的属性
@Cacheable常用于查询方法,能够根据方法的请求参数对其进行缓存
@CachePut常用于更新/保存方法,会将方法返回值放入缓存
@CacheEvict清空缓存

2、Redis 集成步骤

下面是如何在 Spring Boot 应用中使用 spring-boot-starter-cache 与 Redis 进行集成的步骤:

  1. 添加依赖:
    在你的 pom.xml 文件中添加 spring-boot-starter-cachespring-boot-starter-data-redis 的依赖。
<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>
  1. 配置 Redis:
    application.propertiesapplication.yml 文件中配置 Redis 连接信息。

  2. 启用缓存支持:
    在你的 Spring Boot 主类或配置类上添加 @EnableCaching 注解以启用缓存支持。

  3. 定义缓存配置:
    你可以创建一个配置类并实现 CacheManagerCustomizer 接口来自定义缓存配置。或者,你可以使用 @EnableCaching 注解并使用属性来定义缓存配置。

    CacheManagerCustomizer是一个Spring框架的接口,它允许用户自定义扩展CacheManager。

    当需要对某个CacheManager实现进行一些自定义时,可以实现CacheManagerCustomizer接口,指定泛型为需要进行自定义的CacheManager实现类,然后把它定义为一个Spring bean。通过实现这个接口,你可以对Spring的CacheManager进行自定义扩展,例如配置缓存策略、设置缓存过期时间等。

    这个接口的使用可以帮助开发者更好地控制和优化缓存的行为,提高应用程序的性能和响应速度。在实现自定义扩展时,可以使用Spring的注解或XML配置来定义自定义逻辑,并根据需要选择是否将自定义的逻辑应用到所有CacheManager实现上,或者只应用到特定的CacheManager实现上。

@Configuration  
public class CacheConfig {  @Bean  public CacheManagerCustomizer cacheManagerCustomizer() {  return (cacheManager) -> {  SimpleKeyGenerator keyGenerator = new SimpleKeyGenerator();  keyGenerator.setSalt("some_salt"); //设置盐值,增强安全性  cacheManager.getCache("my_cache").setKeyGenerator(keyGenerator); //设置key生成策略  };  }  
}
  1. 使用缓存注解:
    在你的服务类中的方法上使用 Spring 的缓存注解,例如 @Cacheable, @CacheEvict, @CachePut 等。这样,当这些方法被调用时,它们将与 Redis 缓存进行交互。
  2. 自定义序列化:
    如果你需要自定义序列化,你可以创建一个配置类并实现 RedisSerializer 接口。然后,你可以在 Redis 的相关配置中指定这个序列化器。
private Jackson2JsonRedisSerializer<Object> jacksonSerializer() {ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, Visibility.ANY);objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);return new Jackson2JsonRedisSerializer<>(objectMapper,Object.class);
}

3、使用示例

1、创建测试Service

@Service
public class MyService {@Cacheable(value = "my_cache") //将方法结果缓存到"my_cache"中,key为方法参数的哈希值public String getSomeData(String id) throws InterruptedException {// 模拟一个耗时操作,比如从数据库中获取数据Thread.sleep(1000); //休眠1秒,模拟耗时操作return "data for " + id;}
}

2、创建测试类

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.shi9.module.system.service.MyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.StopWatch;@Slf4j
@SpringBootTest
public class MyServiceTest {@Autowiredprivate MyService myService;@Testpublic void getData() throws Exception {StopWatch stopWatch = new StopWatch("getData");stopWatch.start("1");System.out.println(myService.getSomeData("k"));stopWatch.stop();stopWatch.start("2");System.out.println(myService.getSomeData("k"));stopWatch.stop();stopWatch.start("3");System.out.println(myService.getSomeData("k"));stopWatch.stop();System.out.println(stopWatch.prettyPrint());}}

执行结果如下:

data for k
data for k
data for k
StopWatch 'getData': 1.3141034 seconds
----------------------------------------
Seconds       %       Task name
----------------------------------------
1.3104986     100%    1
0.0029345     00%     2
0.0006703     00%     3

可以看见,只有第一次执行耗时,后面两次直接从缓存读取,几乎没有耗时

参考

  • spring-boot-starter-cache
  • spring-boot-starter-redis

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

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

相关文章

代码随想录算法训练营第十天 | 239.滑动窗口最大值、347.前K个高频元素

代码随想录算法训练营第十天 | 239.滑动窗口最大值、347.前K个高频元素 文章目录 代码随想录算法训练营第十天 | 239.滑动窗口最大值、347.前K个高频元素1 LeetCode 239.滑动窗口最大值2 LeetCode 347.前K个高频元素 1 LeetCode 239.滑动窗口最大值 题目链接&#xff1a;https…

防御课程—华为USG6000V1的配置实验(一)

实验拓扑&#xff1a; 实验分析 由实验拓扑图需求分析可知我们在生产区和办公区需要用到子接口技术 实验配置 在Cloud1上配置 在DMZ区域配置 在server1上配置在server2上配置在防火墙上进行的配置 由实验拓扑图可知防火墙与DMZ区域相连的接口为GigabitEthernet1/0/0接口 …

Pandas.Series.median() 中位数 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

MySQL(基础篇)——SQL

一.SQL分类 二.DDL(数据定义语言) 1.DDL——数据库操作 ① 查询 查询所有数据库 SHOW DATABASES 查询当前所处数据库 SELECT DATABASE() ② 创建 CREATE DATABASE [IF NOT EXISTS] 数据库名(通常以db结尾) [DEFAULT CHARSET 字符集] [COLLATE 排序规则] ③ …

C++拾遗(四)引用与指针

引用和指针是两种不同的概念&#xff0c;尽管它们在某些方面有一些相似之处&#xff0c;但它们在功能和用途上是有所区别 声明与定义 引用&#xff1a;引用是别名&#xff0c;是对已存在变量的另一个称呼&#xff0c;一旦一个变量被引用&#xff0c;就不能再被引用其他变 量…

java分布式锁详解

本地锁 浏览器把100w请求由网关随机往下传&#xff0c;在集群情况下&#xff0c;每台服务都放行10w请求过来&#xff0c;这时候每台服务都用的是本地锁是跨JVM的&#xff0c; 列如这些服务都没有49企业&#xff0c;此时有几个服务进行回原了打击在DB上面&#xff0c;那后期把这…

Allegro PCB如何关联原理图?

在用Allegro进行PCB设计时,我们可以点击Orcad原理图上的器件,然后PCB会自动跳转到该器件。那如何操作PCB上的器件点击跳转到原理图呢? 这种方式可以提高设计的效率。具体操作如下。 选择菜单栏Display

【软考问题】-- 2 - 知识精讲 - 项目立项管理

一、基本问题 1&#xff1a;项目投资前时期的四个阶段是什么&#xff1f; a.项目建议与立项申请 (1)定义&#xff1a;项目建设单位向上级主管部门提交项目申请时所必须的文件。(2)特点&#xff1a;项目发展周期的初始阶段、可行性研究的依据。(3)注意&#xff1a;又称项目建议书…

xinput1_3.dll文件的几种修复办法以及修复xinput1_3.dll注意事项

xinput1_3.dll文件是DirectX的一部分&#xff0c;它在Windows系统中负责处理游戏控制器的输入。然而&#xff0c;有时候此文件可能会出现问题&#xff0c;导致游戏无法正常运行或启动。在本文中&#xff0c;将介绍多种解决xinput1_3.dll文件问题的方法&#xff0c;并对它们进行…

【Web前端开发基础】CSS3之空间转换和动画

CSS3之空间转换和动画 目录 CSS3之空间转换和动画一、空间转换1.1 概述1.2 3D转换常用的属性1.3 3D转换&#xff1a;translate3d&#xff08;位移&#xff09;1.4 3D转换&#xff1a;perspective&#xff08;视角&#xff09;1.5 3D转换&#xff1a;rotate3d&#xff08;旋转&a…

vit细粒度图像分类(一)CADF学习笔记

1.摘要&#xff1a; 目的 基于Transformer架构的网络在图像分类中表现出优异的性能。然而&#xff0c;注意力机制往往只关注图像中的显著性特征&#xff0c;而忽略了其他区域的次级显著信息&#xff0c;基于自注意力机制的Transformer也是如此。为了获取更多的有效信息&#…

Spring基于AbstractRoutingDataSource实现MySQL多数据源

目录 多数据源实现 yml配置文件 配置类 业务代码 案例演示 多数据源实现 yml配置文件 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedatasource1:url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezoneUTC&useUnicodetrue&characte…

畅享阅读乐趣,探索精彩世界——推荐电子书网站

畅游书海&#xff0c;无限阅读——推荐优秀电子书网站https://nmbtngeg9486.github.io/ebook/ 在数字时代&#xff0c;电子书阅读已然成为一种时尚&#xff0c;而https://nmbtngeg9486.github.io/ebook/则是一座无限书海&#xff0c;为广大读者提供了丰富多彩的阅读选择。在这里…

企业转型:虚拟化对云计算的影响

虚拟化被认为是IT行业最优秀的技术之一。虚拟化提供的灵活性和效率&#xff0c;有助于企业根据不断变化的需求扩展其IT基础设施。虚拟化是云基础设施的基础&#xff0c;允许按需动态分配和管理计算资源。这种适应性对于满足现代企业的多样化需求至关重要&#xff0c;因为现代企…

外汇天眼:美国证券交易委员会(SEC)采纳了一系列规定,以加强与特殊目的收购公司(SPACs)相关的投资者保护

美国证券交易委员会&#xff08;SEC&#xff09;今天通过了一系列新规和修订&#xff0c;以增强特殊目的收购公司&#xff08;SPACs&#xff09;的首次公开募股&#xff08;IPOs&#xff09;中的披露&#xff0c;并在SPACs与目标公司之间的后续业务合并交易&#xff08;de-SPAC…

u盘可以分区吗?怎么分区?分区后不显示出来怎么办

随着科技的不断发展&#xff0c;U盘已经成为人们传输和存储数据的重要设备之一。而针对U盘的分区问题&#xff0c;很多人对此还不太了解。比如&#xff0c;U盘可以分区吗&#xff1f;U盘怎么分区&#xff1f;U盘分区后不显示出来怎么办&#xff1f;下面我们一起来针对这些问题进…

SpringCloud Aliba-Seata【下】-从入门到学废【8】

目录 1.数据库创建 1.seata_account库下建表 2.seata_order库下建表 3.seata_storage库下建表 4.在每个库下创建回滚日志 2.创建订单模块 2.1建工程 2.2加pom 2.3改yml 2.4file.conf 2.5registry.conf 2.6domain 2.7Dao 2.8Service 2.9controller 2.10confi…

对 MODNet 网络结构直接剪枝的探索

文章目录 1 写在前面2 遇到问题3 解决方案4 探索过程4.1 方案一4.2 方案二4.3 方案三 5 疑惑与思考5.1 Q15.2 Q2 1 写在前面 在前面的文章中&#xff0c;笔者与小伙伴们分享了对 MODNet 主干网络部分以及其余分支分别剪枝的探索历程&#xff0c;即先分解、再处理、后融合的手法…

c#模板设计模式

在 C# 中&#xff0c;模板设计模式是一种行为型设计模式&#xff0c;它允许定义一个算法的框架&#xff0c;并允许子类为一个或多个步骤提供实现。模板设计模式通过定义一个算法的骨架&#xff0c;而将一些步骤的实现延迟到子类中&#xff0c;以实现代码复用和提高扩展性。 以…

算法训练营Day38(动态规划1)

动态规划理论基础 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 区别 动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&…