SpringBoot : ch09 整合Redis

前言

当你的应用程序需要一个快速、可扩展的内存数据库时,Redis是一个非常流行的选择。通过将Redis与Spring Boot集成,你可以轻松地利用Redis的功能,例如缓存、会话存储和消息队列等,从而提升应用程序的性能和可伸缩性。

在本教程中,我们将深入探讨如何在Spring Boot项目中整合Redis。我们将学习如何配置Redis连接、使用Spring Data Redis来进行数据访问操作,以及如何利用Redis作为缓存来提高应用程序的效率。无论你是刚刚接触Spring Boot还是已经有一定经验,这篇教程都将为你展示如何利用Redis为你的应用程序增添强大的功能。

通过本教程的学习,你将对Spring Boot与Redis的整合有一个清晰的理解,并能够在实际项目中应用这些知识。让我们一起开始,探索Spring Boot与Redis这个强大组合带来的无限可能吧!

一、前期准备

1、新建项目,结构如下

2、导入依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- 使用 jackson 序列化器,需要依赖JACKSON包 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>edu.nf.ch09.Ch09Application</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

这段代码是一个基于Spring Boot的项目的pom.xml文件,其中包含了该项目的依赖管理和构建配置。

  1. 依赖:

    • spring-boot-starter-data-redis:这是Spring Boot提供的用于集成Redis的starter,可以方便地进行Redis数据库访问。
    • jackson-databind:这是Jackson库的核心依赖,用于实现Java对象与JSON之间的序列化和反序列化操作。
    • spring-boot-starter-test:这是Spring Boot提供的用于单元测试的starter,包含了常用的测试框架和工具。
    • lombok:这是一个Java库,用于简化Java代码的编写。它提供了一些注解(如@Data@Getter@Setter等),可以自动生成getter、setter方法等。
  2. 依赖管理:

    • spring-boot-dependencies:这是Spring Boot提供的依赖管理BOM(Bill of Materials)文件,用于管理项目中使用的Spring Boot相关依赖的版本。
  3. 构建配置:

    • maven-compiler-plugin:这是Maven的编译插件,用于配置项目的编译选项。在这里,设置了Java的源码版本和目标版本为11,并指定了编码格式为UTF-8。
    • spring-boot-maven-plugin:这是Spring Boot的Maven插件,用于支持将Spring Boot应用程序打包成可执行的JAR文件。在这里,配置了主类的名称和打包方式为repackage

通过以上的配置,可以管理项目的依赖关系,并使用Maven进行项目的构建和打包操作。同时,该项目还集成了Spring Boot、Redis和Lombok等技术,以便开发和测试Spring Boot应用程序。

 

二、配置 RedisConfig 配置类


@Configuration
public class RedisConfig {

    /**
     * 自定义 RedisTemplate
     * @param connectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        RedisTemplate<String,Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        // 设置 key 的序列化器
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置 value 的序列化器
        template.setValueSerializer(RedisSerializer.json());
        template.setHashValueSerializer(RedisSerializer.json());
        return template;
    }

}

这段代码是一个自定义RedisTemplate的配置类。在Spring Boot中,可以通过自定义配置类来创建和配置自定义的Bean。

首先,使用@Configuration注解标识该类是一个配置类,Spring Boot会在启动时加载并应用该配置。

然后,在redisTemplate()方法上使用@Bean注解,表示将该方法返回的对象注册为一个Bean,并由Spring容器进行管理。

redisTemplate()方法中,通过参数RedisConnectionFactory获取到Redis连接工厂,作为创建RedisTemplate的参数。

接着,创建一个RedisTemplate对象,并将连接工厂设置为其连接工厂。

然后,通过调用setKeySerializer()setValueSerializer()方法,分别设置key和value的序列化器。在这里,使用了RedisSerializer的静态方法string()json()来获取String和JSON的序列化器。

最后,返回创建的RedisTemplate对象。

通过自定义RedisConfig类,可以创建一个自定义的RedisTemplate,并对其进行相关配置,例如设置序列化器等。在其他需要使用RedisTemplate的地方,可以直接注入该Bean来进行操作。

需要注意的是,为了让Spring Boot能够正确识别和加载自定义RedisTemplate,需要将RedisConfig类所在的包路径包含在@ComponentScan或@SpringBootApplication注解中。或者将RedisConfig类放在主配置类(如Application类)所在的子包下,这样可以自动扫描到该配置类。

三、配置 yml 

spring:
  # 配置 redis 配置
  redis:
    # 指定使用第几个数据库
    database: 0
    # 主机地址
    host: 127.0.0.1
    # 端口号
    port: 6379
    # 指定超时时间
    timeout: 2000

这段配置是用来配置Spring Boot应用程序连接Redis的相关参数。

在配置文件中,以spring.redis为前缀,可以设置以下参数:

  • database:指定要使用的Redis数据库,默认为0。如果应用程序需要访问多个数据库,可以通过修改此值来切换数据库。

  • host:指定Redis服务器的主机地址。在这里,设置为127.0.0.1表示本地主机。

  • port:指定Redis服务器的端口号。默认情况下,Redis服务器使用6379作为默认端口。

  • timeout:指定连接到Redis服务器的超时时间,单位为毫秒。如果连接在指定的时间内没有响应,将会抛出连接超时异常。

通过在配置文件中设置这些参数,应用程序将会使用指定的主机地址、端口号和超时时间来连接到Redis服务器。这样,在应用程序中就可以直接使用自动装配的RedisTemplate进行操作。

需要注意的是,配置文件的格式可能会根据不同的配置方式而有所差异。上述示例是使用YAML格式的配置文件,如果你使用的是其他格式的配置文件,可能需要做相应的调整。

四、新建一个 User 实体类


@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {

    private Integer id;
    private String userName;

}

这段代码定义了一个User类,该类具有以下特点:

  • 使用了@Data注解,它是Lombok库提供的一个注解,用于自动生成getter、setter、toString、equals、hashCode等常用方法。

  • 使用了@AllArgsConstructor注解,它是Lombok库提供的一个注解,用于生成一个包含所有参数的构造函数。

  • 使用了@NoArgsConstructor注解,它是Lombok库提供的一个注解,用于生成一个无参构造函数。

  • 实现了Serializable接口,表示该类可以在网络中进行传输或在磁盘上进行存储,这通常用于对象的序列化和反序列化操作。

该User类有两个属性:

  • id:表示用户的ID,类型为Integer。

  • userName:表示用户名,类型为String。

通过使用Lombok库提供的注解,可以简化Java类的编写,自动生成常用的方法和构造函数,减少了冗余的代码。同时,实现Serializable接口可以让User类的对象在不同的环境中进行传输和持久化存储。

 五、操作 redis

1、返回 String

@Service
@RequiredArgsConstructor
public class UserService {

    /**
     * 默认装配的是 StringRedisTemplate ,用于操作字符串
     */
    private final StringRedisTemplate template;


    /**
     * key 的前缀
     */
    private final static String PREFIX = "user:";

    /**
     * 返回 String
     * @param id
     * @return
     */
    public String getUser(Integer id){
        if (!template.hasKey(PREFIX + id)){
            // 保存到 Redis
            template.opsForValue().set(PREFIX + id,"user1");
            // 设置过期时间
            template.expire(PREFIX + id,1800, TimeUnit.MINUTES);
        }
        return template.opsForValue().get(PREFIX + id);
    }


}

这段代码定义了一个名为UserService的服务类,其中包含以下方法:

  • getUser(Integer id):该方法接受一个参数id,表示要获取用户信息的ID。如果Redis中存在该用户的信息,则直接从Redis中获取并返回;否则,将用户信息保存到Redis中,并设置过期时间为30分钟,最后再返回用户信息。

在该服务类中使用了@Service注解,表示将该类标记为一个服务类,并由Spring容器进行管理。

在构造函数上使用了@RequiredArgsConstructor注解,它是Lombok库提供的一个注解,用于生成一个包含所有final成员变量的构造函数,并自动进行依赖注入。在这里,使用了StringRedisTemplate类的实例作为依赖注入的参数,表示将其注入到UserService类中。

在getUser()方法中,首先判断Redis中是否存在指定的key,如果不存在则将用户信息保存到Redis中,并设置过期时间为30分钟。最后,从Redis中获取用户信息并返回。

通过将业务逻辑封装在服务类中,可以使得业务逻辑与具体的实现细节解耦,方便进行单元测试和维护。同时,使用StringRedisTemplate类来操作Redis,可以简化对Redis的操作,提高开发效率。 

2、返回一个对象
@Service
@RequiredArgsConstructor
public class UserService {


    private final RedisTemplate<String, Object> template;
    /**
     * key 的前缀
     */
    private final static String PREFIX = "user:";


    /**
     * 返回 对象
     * @param id
     * @return
     */
    public User getUser(Integer id){
        if (!template.hasKey(PREFIX + id)){
            User user = new User(id,"qiu");
            // 保存到 Redis
            template.opsForValue().set(PREFIX + id,user);
            // 设置过期时间
            template.expire(PREFIX + id,1800, TimeUnit.SECONDS);
        }
        return (User) template.opsForValue().get(PREFIX + id);
    }

}

解释如下:

  • @Service注解表示这是一个Spring的服务组件,用于处理业务逻辑。
  • @RequiredArgsConstructor注解是Lombok库提供的注解,用于生成带有必需参数的构造函数。
  • RedisTemplate<String, Object>是一个用于操作Redis的模板类,其中String表示Redis的key的类型,Object表示Redis的value的类型。
  • PREFIX是一个常量,用于设置Redis中存储用户对象的key的前缀。
  • getUser()方法用于获取用户对象。首先,它会检查Redis中是否存在指定key,如果不存在,则创建一个新的User对象,并将其保存到Redis中。同时,还设置了该key的过期时间为1800秒。最后,通过模板类的opsForValue().get()方法从Redis中获取用户对象并返回。

通过使用这个UserService类,你可以在获取用户对象时先尝试从Redis缓存中获取,如果缓存中不存在,则去数据库中查询,并将结果存入Redis缓存,以提高查询性能和减轻数据库负载。

3、测试
1)返回字符串
 @Test
    void contextLoads() {
        String user = service.getUser(1000);
        log.info(user);
    }

 运行结果:

2)返回对象
 @Test
    void contextLoads() {
        User user = service.getUser(2);
        log.info(user.getUserName());
    }

 运行结果:

 

六、SpringBoot 整合 Redis 的好处? 

Spring Boot 整合 Redis 有以下几个好处:

  1. 缓存支持:Redis 是一种高性能的缓存数据库,通过将数据存储在 Redis 中,可以大大提高系统的读取性能。Spring Boot 提供了对 Redis 的无缝集成,可以方便地使用 Redis 作为缓存存储。

  2. 分布式锁支持:在分布式系统中,为了保证数据的一致性和避免并发冲突,常常需要使用分布式锁。Redis 提供了原子操作和特定数据结构(如 Redisson)来实现分布式锁。通过 Spring Boot 整合 Redis,可以方便地使用 Redis 实现分布式锁,确保多个节点之间的数据访问的互斥性。

  3. 会话管理支持:在 Web 应用程序中,会话管理是非常重要的功能。通过 Spring Session 和 Redis 结合使用,可以将会话数据存储在 Redis 中,实现分布式环境下的会话共享,提高系统的可伸缩性和稳定性。

  4. 发布/订阅支持:Redis 提供了发布/订阅模式,可以实现消息的广播和订阅。通过 Spring Boot 整合 Redis,可以方便地使用 Redis 的发布/订阅功能,实现消息的异步通信和事件驱动。

  5. 数据持久化支持:除了作为缓存数据库,Redis 还可以作为持久化存储数据库使用。通过 Spring Boot 整合 Redis,可以方便地将数据持久化到 Redis 中,并进行读取和查询。

综上所述,Spring Boot 整合 Redis 可以提供缓存支持、分布式锁支持、会话管理支持、发布/订阅支持和数据持久化支持,增强了系统的性能、可伸缩性和稳定性,使开发人员可以更方便地利用 Redis 提供的功能和特性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCvSharp从入门到实践-(04)色彩空间

目录 1、GRAY色彩空间 2、从BGR色彩空间转换到GRAY色彩空间 2.1色彩空间转换码 2.2实例 BGR色彩空间转换到GRAY色彩空间 3、HSV色彩空间 4、从BGR色彩空间转换到HSV色彩空间 4.1色彩空间转换码 4.2实例 BGR色彩空间转换到HSV色彩空间 1、GRAY色彩空间 GRAY色彩空间通常…

echarts案例网站

一、ppchart 网站&#xff1a;https://ppchart.com/#/ 二、echarts官网示例 网站&#xff1a;https://echarts.apache.org/examples/zh/index.html

Linux:通过VMWare,定制化Linux系统

一、原理图 二、新增磁盘&#xff08;对应上图sdb盘&#xff09; 三、挂载磁盘 主要是四步&#xff1a;查看磁盘&#xff0c;分区磁盘&#xff0c;格式化磁盘&#xff0c;挂载磁盘 1、查看磁盘 2、分区磁盘 3、格式化磁盘 4、挂载磁盘 创建两个备用目录&#xff0c;用于磁盘…

初刷leetcode题目(8)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

12 网关实战:Spring Cloud Gateway基础理论

为什么需要网关? 传统的单体架构中只有一个服务开放给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,那么作为客户端如何去调用这些微服务呢?如果没有网关的存在,只能在本地记录每个微服务的调用地址。 无网关的微服务架构往往存在以下问题: 客户端多次请求…

没有哈希时间锁定合约的跨链原子交换

在上一篇文章中&#xff0c;我们介绍了使用哈希时间锁定合约&#xff08;HTLC&#xff09;的跨链原子交换实现。 今天&#xff0c;我们介绍一种无需 HTLC 即可实现的替代方法。 这将原子交换扩展到缺乏哈希锁和时间锁的区块链。 使用 SPV 证明交易已被挖掘 让我们按照商定的价…

监控大屏 | 拐角OLED柔性屏:实现拐角处连惯拼接显示

监控大屏 | 拐角OLED柔性屏 产品&#xff1a;20块55寸OLED柔性屏 项目时间&#xff1a;2023年10月 项目地点&#xff1a;贵州 应用场景&#xff1a;在监控大厅三面墙都要装显示屏&#xff0c;利用OLED柔性屏可弯曲的特性&#xff0c;在两个捌角处进行拼接安装。 在2023年10…

力扣 hot100 最小覆盖子串 滑动窗口 字符计数

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f37b; AC code class Solution {public String minWindow(String s, String t){int n s.length();int m t.length();if (n < m)return "";char[] tt t.toCharArray();int[] cnt new int[128];// 字符计数数组…

Docker 容器日志查看和清理

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

【Android】Android Framework系列--Launcher3各启动场景源码分析

Android Framework系列–Launcher3各启动场景源码分析 Launcher3启动场景 Launcher3是Android系统提供的默认桌面应用(Launcher)&#xff0c;它的源码路径在“packages/apps/Launcher3/”。 Launcher3的启动场景主要包括&#xff1a; 开机后启动&#xff1a;开机时&#xff…

[原创][1]探究C#多线程开发细节-“Thread类的简单使用“

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…

spring-boot集成mybatis-generator

通用 Mapper 在 1.0.0 版本的时候增加了 MyBatis Generator (以下简称 MBG) 插件&#xff0c;使用该插件可以很方便的生成实体类、Mapper 接口以及对应的 XML 文件。 下面介绍了 mybatis-generator 在 spring-boot 中的使用过程 一、引入pom依赖 <dependencies><de…

双通道 12V 直流电机驱动芯片GC8548,12V,大电流,具有短地短电源保护功能,可替代LV8548/LV8549/ONSEMI

GC8548 是一款双通道 12V 直流电机驱动芯 片&#xff0c;为摄像机、消费类产品、玩具和其他低压或 者电池供电的运动控制类应用提供了集成的电机 驱动解决方案。芯片一般用来驱动两个直流电机 或者驱动一个步进电机。 可以工作在 3.8~12V 的电源电压上&#xff0c; 每通道能提供…

事件机制?

事件流&#xff1a; 描述的页面接收事件的顺序。先进行事件捕获 到达目标元素 在进行事件冒泡 分为事件捕获和事件冒泡 事件冒泡&#xff1a;从具体元素从内向外依次触发事件 从下面这个小案例可以清楚了解什么是事件冒泡 <!DOCTYPE html> <html lang"en"…

Mysql之局域网内不同ip互登陆mysql

1 navicat修改mysql表中user> host改为% 2 重新加载mysql服务 3登陆mysql -h 192.168.x.xxx&#xff08;计算机ip&#xff09; -P 3306 -uroot -p123456&#xff08;密码&#xff09;

P8A003-系统加固-系统管理员账户安全

【预备知识】 Administrator 原意为管理人或行政官员或遗产管理人&#xff0c;在计算机名词中&#xff0c;它的意思是系统超级管理员或超级用户。但是在Windows系统中此用户名只在安全模式中使用。 【实验步骤】 网络拓扑&#xff1a;server2008-basic windows server 2008 …

【Java】使用IntelliJ IDEA搭建SSM(MyBatis-Plus)框架并连接MySQL数据库

步骤 0 准备工作1 创建Maven项目2 配置Maven依赖3 配置数据源4 项目结构5 创建实体类6 创建数据访问层7 创建服务层8 创建Controller层9 启动项目10 使用Postman测试接口 0 准备工作 下载并安装 IntelliJ IDEA下载并安装 MySQL 数据库下载并安装Postman测试工具使用 Navicat 创…

Mysql 不执行索引问题与优化

难以查找的隐藏问题 及 解决办法&#xff1a; 问题总结&#xff1a;

【无标题】【教3妹学编程-算法题】设计前中后队列

3妹&#xff1a;好冷啊&#xff0c; 冻得瑟瑟发抖啦 2哥 : 又一波寒潮来袭&#xff0c; 外面风吹的呼呼的。 3妹&#xff1a;今天还有雨&#xff0c;2哥上班记得带伞。 2哥 : 好的 3妹&#xff1a;哼&#xff0c;不喜欢冬天&#xff0c;也不喜欢下雨天&#xff0c;要是我会咒语…

基于C#实现梳排序

为什么取名为梳&#xff0c;可能每个梳都有自己的 gap 吧&#xff0c;大梳子 gap 大一点&#xff0c;小梳子 gap 小一点。上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化&#xff0c;将单向的比较变成了双向&#xff0c;同样这里的梳排序也是在冒泡排序上做了一些优化。 …