Spring 全家桶之 Spring Boot 2.6.4( Ⅰ )- Caching(Part C)(上)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Spring 全家桶之 Spring Boot 2.6.4( Ⅰ )- Caching(Part C)

二、Redis

将方法查询结果保存在ConcurrentMap中是一种临时性的方案,一旦应用重启所有的缓存全部被清除了,所以最好还是使用EhCache、Redis中间件用作缓存,可以将缓存进行持久化

整合Redis

Spring Boot整合Redis只需要在pom文件中添加redis-starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
复制代码

配置Redis

# 默认就是使用localhost
spring:
    redis:
      port: 6379
      host: localhost
      password: 12345
      database: 0
复制代码

562f62e3ba5e4efea3abfbdfa8e68993_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

如果使用本地安装的redis,端口为6379并且没有密码,可以不用配置连接信息,直接使用默认的配置即可

Redis自动配置类是RedisAutoConfiguration

d6dd3613cb5540a1b6e00b68a957f4a8_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

该类往容器中添加了两个组件RedisTemplate和StringRedisTemplate,其中RedisTemplate是用于操作K、V都是字符串的数据,RedisTemplate用于操作K、V都是对象的数据

操作 String 类型数据

在test包下新建测试类StringRedisTemplateTest,导入StringRedisTemplate

@SpringBootTest
public class StringRedisTemplateTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Test
    public void testValue(){
        stringRedisTemplate.opsForValue().append("hello","thor");
        String hero = stringRedisTemplate.opsForValue().get("hello");
        System.out.println("读取到的数据为:" + hero);
    }
}
复制代码

51bba1f916c745b9970d6bdba8d2b6bf_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

通过opsForValue()的append()方法和get()方法可以往redis中添加和读取数据

操作 List 类型数据

新增一个测试方法testList(),操作List类型数据

@Test
public void testList(){
    stringRedisTemplate.opsForList().leftPush("heros","thor");
    stringRedisTemplate.opsForList().rightPushAll("heros","banner", "stark", "clint");
    String hero = stringRedisTemplate.opsForList().index("heros",2);
    System.out.println("索引为2位置的元素为:" + hero);
    System.out.println("左侧弹出一个元素" + stringRedisTemplate.opsForList().leftPop("heros"));
}
复制代码

7297f42ff0f1477cacb0b9ef36a9b850_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

redisTemplate 操作对象

新建一个测试类RedisTemplateTest

@SpringBootTest
public class RedisTemplateTest {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private TeslaService teslaService;
    @Test
    public void testObject(){
        Tesla tesla = teslaService.getTeslaById(1166057546);
        redisTemplate.opsForValue().set("1166057546",tesla);
        // 获取存储的对象
        Tesla teslaAtRedis = (Tesla) redisTemplate.opsForValue().get("1166057546");
        System.out.println("Redis中存储的对象:" + teslaAtRedis);
    }
}
复制代码

image.png

这是因为没有实现序列化接口导致的报错

使entity包下的Tesla实体类和Factory实体类实现序列化Serializable接口

再次测试

image.png

查看Redis中存储的数据

dd65410c400a475b82cf464ee1d64927_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

默认保存对象,使用jdk序列化机制,序列化的数据保存到redis中,如果想要保存json格式的数据就需要自定义RedisTemplate,使用指定的序列化规则

将LilithCacheKeyGeneartor重命名为LilithConfig,作为自定义主配置类,增加自定义的RedisTemplate

@Bean
public RedisTemplate<Object, Tesla> teslaRedisTemplate(RedisConnectionFactory factory){
    RedisTemplate<Object, Tesla> teslaRedisTemplate = new RedisTemplate<>();
    teslaRedisTemplate.setConnectionFactory(factory);
    teslaRedisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Tesla.class));
    return teslaRedisTemplate;
}
复制代码

Jackson2JsonRedisSerializer序列化器可以在redis中保存Json格式数据

image.png

@Autowired
private RedisTemplate<Object, Tesla> teslaRedisTemplate;
@Test
public void testObjectByTeslaRedisTemplate(){
    Tesla tesla = teslaService.getTeslaById(1166057547);
    teslaRedisTemplate.opsForValue().set("1166057547", tesla);
    // 获取存储的对象
    Tesla teslaAtRedis = teslaRedisTemplate.opsForValue().get("tesla");
    System.out.println("Redis中存储的对象:" + teslaAtRedis);
}
复制代码

image.png

再次查看redis中保存的数据的格式已经变为json格式

20d83fa411df40a28afadbed6fb50ba9_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

三、Redis整合CacheManager

引入redis的starter后,在application.yml配置文件中开启debu=true,查看控制台输出内种中有哪些组件匹配上了

image.png

注意有两个RedisCacheConfiguration,这里匹配上的是autoconfigure.cache包下的RedisCacheConfiguration

RedisCacheConfiguration配置类往容器中添加了一个RedisCacheManager缓存管理器,并且容器中存在RedisConnectionFactory的前提下才会导入RedisCacheManager

image.png

RedisCacheManager通过loadCaches()方法来获取缓存

image.png

如果不存在就通过createRedisCache()方法来创建缓存

image.png

RedisCacheManager可以创建RedisCache来作为缓存组件,RedisCache通过操作redis缓存数据。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
监控 Java 应用服务中间件
Spring和Spring Boot的区别
Spring和Spring Boot的主要区别,包括项目配置、开发模式、项目依赖、内嵌服务器和监控管理等方面,强调Spring Boot基于Spring框架,通过约定优于配置、自动配置和快速启动器等特性,简化了Spring应用的开发和部署过程。
54 19
|
2月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
68 2
|
2月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
112 1
|
2月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
28 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
2月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
28 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
2月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
182 2
|
2月前
|
前端开发 安全 Java
【Spring】Spring Boot项目创建和目录介绍
【Spring】Spring Boot项目创建和目录介绍
84 2
|
3月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
136 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
105 0
下一篇
无影云桌面