如何在 SpringBoot 项目创建并使用 Redis 的详细介绍


Redis
本文是博主整理项目时整理出来的,项目使用 SpringBoot 框架,使用 Redis 作为缓存组件,用于缓存部分热点接口数据。


文章目录

    • 一、Redis 的前置配置
      • 1、引入依赖
      • 2、单机配置
      • 3、集群配置
      • 4、两种配置路径解读
    • 二、创建 Redis 配置类
      • 1、简易版 RedisConfig
      • 2、复杂版 RedisConfig
    • 三、RedisTemplate 类
    • 四、创建 Redis 操作类
    • 五、opsForValue 方法
    • 六、在代码中使用 Redis

一、Redis 的前置配置

项目如果要使用 Redis 服务,那么项目就要引入 Redis 服务,就像你需要人帮忙,就需要先把人找到并带过来。

1、引入依赖

在 pom.xml 文件中添加 Spring Boot 的 Redis 依赖。通常使用 spring-boot-starter-data-redis,它集成了 Spring Data Redis 和 Redis 客户端。

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

2、单机配置

单机配置最基础的 Redis 配置方式,适用于单机模式。配置路径直接在 spring.redis 下。主要配置了 Redis 的主机地址、端口和密码。如果没有密码,可以省略 password 字段。适用于简单的单机 Redis 部署,不涉及集群或哨兵模式。

使用 application.properties 文件配置。

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=your_password # 如果没有密码,可以省略

使用 application.yml 文件配置。

spring:
  redis:
    host: localhost
    port: 6379
    password: your_password # 如果没有密码,可以省略

3、集群配置

这种配置方式更详细,支持集群模式和更多高级配置。配置路径在 spring.data.redis 下。在配置中明确指定了使用 Lettuce 作为 Redis 客户端。支持集群模式 cluster ,可以指定多个节点。提供了更多高级配置,如连接池配置和管道缓冲区大小。适用于 Redis 集群模式或需要高级配置(如连接池、超时时间等)的场景。更适合生产环境,因为集群模式可以提高可用性和性能。

spring:
  data:
    redis:
      client-type: lettuce # 指定使用Lettuce作为Redis客户端(有多种客户端,可自行了解)
      timeout: 6000 # 设置Redis操作的超时时间为6000毫秒
      cluster:
        max-redirects: 3 # 设置集群模式下最大重定向次数为3
        nodes: 10.100.4.205:8001,10.100.4.205:8002,10.100.4.205:8003 # 指定Redis集群节点地址
      lettuce:
        pipe:
          buffer-size: 3000 # 设置Lettuce管道缓冲区大小为3000字节
        pool:
          max-wait: -1 # 设置连接池最大等待时间为-1,表示无限制等待
          max-active: 64 # 设置连接池最大连接数为64
          min-idle: 5 # 设置连接池最小空闲连接数为5
          max-idle: 10 # 设置连接池最大空闲连接数为10

4、两种配置路径解读

在 Spring Boot 中,spring.redisspring.data.redis 两种路径虽有不同,但本质上是一致的。

  • spring.redis:这是 Spring Boot 提供的默认 Redis 配置路径,适用于简单的单机 Redis 配置。
  • spring.data.redis:这是 Spring Data Redis 提供的配置路径,支持更复杂的 Redis 配置,如集群、哨兵、连接池等高级功能。
  • 推荐 spring.data.redis 路径,它提供了更全面的配置选项,支持的各种高级特性。

Spring Boot 支持自动配置这两种方式,自动配置机制会根据 application.propertiesapplication.yml 文件中的配置,自动创建 Redis 客户端实例,如 StringRedisTemplateRedisTemplate 。只需要正确填写配置文件,Spring Boot 会根据配置自动初始化 Redis 客户端,并注入到代码中,无需手动编写配置代码。

二、创建 Redis 配置类

Redis 是一个 NoSQL 数据库,用于存储键值对形式的数据,但是存到数据库的格式可能和我们使用的对象格式不同,如何保证存入数据和取出数据保持一致,就是下面的代码。创建一个配置类来配置 RedisTemplate ,这是操作 Redis 的核心类。

下面有两个简易的使用示例来演示如何使用 RedisTemplate :

1、简易版 RedisConfig

@Configuration
public class RedisConfig {

	// 简易版 key - value,存储 String 形式
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new StringRedisSerializer());
        return template;
    }
    
}

2、复杂版 RedisConfig

@Configuration // 标记当前类为配置类
public class RedisConfig { // 定义Redis配置类

    private static final String REDIS_ADDR_PREFIX = "redis://"; // 定义Redis地址前缀常量

    @Bean // 标记方法为Bean定义方法,定义RedisTemplate Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory lettuceConnectionFactory) { 
    	// 创建RedisTemplate实例
        RedisTemplate<String, Object> template = new RedisTemplate<>(); 
        // 设置Redis连接工厂
        template.setConnectionFactory(lettuceConnectionFactory); 

        // 配置序列化器,创建ObjectMapper实例
        ObjectMapper objectMapper = new ObjectMapper(); 
        // 设置所有属性可见
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); 
        // 启用默认类型
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 
        // 创建Jackson2JsonRedisSerializer实例
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); 
		// 设置ObjectMapper
        serializer.setObjectMapper(objectMapper); 
        // 创建StringRedisSerializer实例
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); 
        // 将String或者Hash都用String序列化形式序列化,反序列化取出时使用Jackson2
        template.setKeySerializer(stringRedisSerializer); // 设置键序列化器
        template.setValueSerializer(serializer); // 设置值序列化器
        template.setHashKeySerializer(stringRedisSerializer); // 设置哈希键序列化器
        template.setHashValueSerializer(serializer); // 设置哈希值序列化器
        template.afterPropertiesSet(); // 初始化模板属性
        return template; // 返回RedisTemplate实例
    }

    @Bean // 标记方法为Bean定义方法,定义BeanPostProcessor Bean
    public BeanPostProcessor lettuceConnectionFactoryBeanProcessor() { 
   		// 创建匿名内部类实例
        return new BeanPostProcessor() { 
        	// 重写postProcessBeforeInitialization方法
            @Override
            public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
            	// 判断Bean是否为LettuceConnectionFactory实例
                if (bean instanceof LettuceConnectionFactory) { 
                	// 转换为LettuceConnectionFactory实例
                    LettuceConnectionFactory factory = (LettuceConnectionFactory) bean; 
                    // 设置管道刷新策略
                    factory.setPipeliningFlushPolicy(LettuceConnection.PipeliningFlushPolicy.buffered(50)); 
                }
                return bean; // 返回Bean实例
            }
        };
    }
}

三、RedisTemplate 类

RedisTemplate 是 Spring Data Redis 框架提供的一个用于操作 Redis 数据库的高级抽象类。它封装了对 Redis 的底层操作,能够以一种更简洁、更安全、更符合 Spring 框架风格的方式与 Redis 进行交互。

RedisTemplate 提供了一套丰富的 API,用于执行 Redis 的各种命令,封装 Redis 操作。

  • 键操作:set(key, value)、get(key)、delete(key) 等。
  • 数据结构操作:支持 Redis 中的字符串(String)、列表(List)、集合(Set)、哈希(Hash)和有序集合(ZSet)等数据结构。
  • 事务操作:支持 Redis 的事务功能,可以通过 multi()exec() 方法来实现。
  • Lua 脚本执行:可以执行 Redis 的 Lua 脚本,用于复杂的原子操作。

RedisTemplate 允许开发者指定键和值的序列化方式,可以做到类型安全和序列化。虽然 Redis 存储的数据是字节数组,但 RedisTemplate 可以通过序列化器将 Java 对象转换为字节数组。通过自定义序列化器,可以解决 Redis 中存储和读取数据时的类型安全问题。

  • StringRedisSerializer:用于字符串类型的键和值。
  • Jackson2JsonRedisSerializer:将对象序列化为 JSON 格式,常用这个序列化器。
  • GenericJackson2JsonRedisSerializer:支持泛型的 JSON 序列化。

RedisTemplate 是 Spring Data Redis 框架的一部分,与 Spring 的其他组件(如事务管理、依赖注入等)无缝集成。

  • 可以通过 Spring 的 @Bean 注解或 XML 配置来初始化 RedisTemplate。
  • 支持 Spring 的事务管理,可以通过 @Transactional 注解在事务中使用 RedisTemplate。
  • RedisTemplate 是线程安全的,可以在多线程环境中安全使用。

RedisTemplate 将 Redis 的原生异常(如 JedisException)转换为 Spring 的 DataAccessException,使得异常处理更加统一和符合 Spring 的风格。

四、创建 Redis 操作类

Redis 操作类是将 RedisTemplate 中的操作方法封装起来,用于提供存储方法。

@Service
public class RedisService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void setValue(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public Object getValue(String key) {
        return redisTemplate.opsForValue().get(key);
    }
    
}

该类使用了 RedisTemplate 中的 opsForValue 方法,曝露了 set 和 get 的方法用于存取缓存。

五、opsForValue 方法

RedisTemplate.opsForValue() 是 Spring Data Redis 提供的一个用于操作 Redis 中字符串类型数据的方法。通过这个方法,可以获取一个 ValueOperations 对象,进而对 Redis 中的键值对进行各种操作。

// 用于将指定的值存储到 Redis 中。
redisTemplate.opsForValue().set(key, value);

// 根据键获取对应的值。
String value = redisTemplate.opsForValue().get(key);

// 追加值:在现有值的末尾追加字符串。
redisTemplate.opsForValue().append(key, "appendValue");

// 获取并设置值:获取旧值并设置新值。
String oldValue = redisTemplate.opsForValue().getAndSet(key, "newValue");

// 设置值并设置过期时间:设置值的同时可以指定过期时间。
redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);

// 原子性设置值(仅当键不存在时):如果键不存在,则设置值并返回 true;否则返回 false。这个方法常用于实现分布式锁。
Boolean success = redisTemplate.opsForValue().setIfAbsent(key, value, timeout, TimeUnit.SECONDS);

// 获取子字符串:获取键对应的值的子字符串。
String substring = redisTemplate.opsForValue().get(key, start, end);

// 获取字符串长度:获取键对应的值的长度。
Long length = redisTemplate.opsForValue().size(key);

除了 opsForValue 方法外还有其他类型的操作方法:

  • opsForList:操作 LIst 列表。
  • opsForHash:操作 Hash 哈希。
  • opsForSet:操作 Set 集合。
  • opsForZSet:操作 ZSet 有序集合。

除了以上的方法之外还有其他方法,可自行查阅。

六、在代码中使用 Redis

在业务逻辑中注入 RedisService,并调用其方法来操作 Redis 。

@Component
public class YourService {

    @Autowired
    private RedisService redisService;

    public void someMethod() {
        // 设置值
        redisService.setValue("key", "value");

        // 获取值
        Object value = redisService.getValue("key");
        System.out.println("Value from Redis: " + value);
    }
}

结语:通过以上方式,可以在 SpringBoot 项目中正确使用 Redis 缓存进行业务处理。

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

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

相关文章

快速入门——第三方组件element-ui

学习自哔哩哔哩上的“刘老师教编程”&#xff0c;具体学习的网站为&#xff1a;10.第三方组件element-ui_哔哩哔哩_bilibili&#xff0c;以下是看课后做的笔记&#xff0c;仅供参考。 第一节 组件间的传值 组件可以有内部Data提供数据&#xff0c;也可由父组件通过prop方式传…

使用 Grafana 监控 Spring Boot 应用

随着软件开发领域的不断发展&#xff0c;监控和可观测性已成为确保系统可靠性和性能的关键实践。Grafana 是一个功能强大的开源工具&#xff0c;能够为来自各种来源的监控数据提供丰富的可视化功能。在本篇博客中&#xff0c;我们将探讨如何将 Grafana 与 Spring Boot 应用程序…

《深度学习》——RNN网络简单介绍

文章目录 RNN网络简介工作原理网络结构训练方法应用领域 RNN网络简介 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种专门用于处理序列数据的神经网络&#xff0c;在自然语言处理、语音识别、时间序列预测等领域有广泛应用。 RNN 是一种…

深入解析JVM垃圾回收机制

1 引言 本节常见面试题 如何判断对象是否死亡&#xff08;两种方法&#xff09;。简单的介绍一下强引用、软引用、弱引用、虚引用&#xff08;虚引用与软引用和弱引用的区别、使用软引用能带来的好处&#xff09;。如何判断一个常量是废弃常量如何判断一个类是无用的类垃圾收…

python网络安全怎么学 python做网络安全

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 众所周知&#xff0c;python是近几年比较火的语言之一&#xff0c;它具有简单易懂、免费开源、可移植、可扩展、丰富的第三方库函数等特点&#xff0c;Java需要大…

使用excel中的VBA合并多个excel文件

需求是这样的&#xff1a; 在Windows下&#xff0c;用excel文件让多个小组填写了统计信息&#xff0c;现在我需要把收集的多个文件汇总到一个文件中&#xff0c;前三行为标题可以忽略&#xff0c;第四行为收集信息的列名&#xff0c;处理每一行数据的时候&#xff0c;发现某一行…

【算法】2022年第十三届蓝桥杯大赛软件类省赛Java大学C组真题

个人主页&#xff1a;NiKo 算法专栏&#xff1a;算法设计与分析 目录 题目 2680:纸张尺寸 题目 2664:求和 题目 2681: 矩形拼接 题目 2665: 选数异或 题目 2682: GCD 题目 2667: 青蛙过河 题目 2683: 因数平方和 题目 2668: 最长不下降子序列 题目 2680:纸张尺寸 题目…

2025雅森北京展今天开幕,全景展现新能源汽车时代

推动汽车后市场全产业链向新向优转型升级 在2月21日举行的第36届中国国际汽车服务用品及设备展览会&#xff0c;中国国际新能源汽车技术、零部件及服务展览会&#xff08;雅森北京展CIAACE&#xff09;上&#xff0c;雅森国际总裁谢宇表示&#xff0c;当前正处在汽车行业新旧动…

PHP.INI的作用以及如何设置

php.ini是网站服务器上的一个重要配置文件&#xff0c;它包含了决定PHP运行环境特性的关键设置&#xff0c;直接关系到网站能否顺畅运行。每次 PHP 启动时&#xff0c;系统都会读取这个文件&#xff0c;加载相应的配置并将其应用到网站的脚本上。 尽管服务器通常预装了一些默认…

新版IDEA配置 Tomcat

配置tomcat 先检查自己的tomcat是否已经安装完成以及是否有其他问题&#xff0c;这里不对Tomcat方面的问题进行讲解。 新版IDEA需要在已有项目中添加Web部分的项目结构。 安装完成之后&#xff0c;打开要创建Web项目的项目(这里演示使用新建项目) 第一步&#xff0c;先给项…

整理好的java面试八大常用算法

原创不易&#xff0c;如果有转载需要的话&#xff0c;请在首行附上本文地址&#xff0c;谢谢。 文中整理了八大常见的排序算法&#xff0c;冒泡排序、选择排序、快速排序、插入排序、堆排序、希尔排序、归并排序和基数排序的简单思想&#xff0c;每种算法配有动图分析和相应的…

Baklib智能平台:数据驱动下的企业知识安全与协作

内容概要 在数字化转型加速渗透的今天&#xff0c;企业知识资产的智能化管理与安全防护已成为核心竞争力构建的关键环节。Baklib作为新一代知识中台&#xff08;Knowledge Hub&#xff09;的典型代表&#xff0c;以数据驱动技术为核心引擎&#xff0c;重构了企业知识管理的底层…

深度学习-7.超参数优化

Deep Learning - Lecture 7 Hyperparameter Optimization 简介超参数搜索用于超参数选择的贝叶斯优化启发性示例贝叶斯优化 引用 本节目标&#xff1a; 解释并实现深度学习中使用的不同超参数优化方法&#xff0c;包括&#xff1a; 手动选择网格搜索随机搜索贝叶斯优化 简介 …

【漫画机器学习系列】102.带泄露线性整流函数(Leaky ReLU)

Leaky ReLU&#xff08;带泄露线性整流函数&#xff09;详解 1. 什么是 Leaky ReLU&#xff1f; Leaky ReLU&#xff08;带泄露线性整流函数&#xff09;是一种改进的 ReLU&#xff08;Rectified Linear Unit&#xff0c;线性整流单元&#xff09;激活函数。与标准 ReLU 不同…

GeoHD - 一种用于智慧城市热点探测的Python工具箱

GeoHD - 一种用于智慧城市热点探测的Python工具箱 详细原理请参考&#xff1a;Yan, Y., Quan, W., Wang, H., 2024. A data‐driven adaptive geospatial hotspot detection approach in smart cities. Trans. GIS tgis.13137. 代码下载&#xff1a;下载 1. 简介 在城市数据…

Github 2025-02-23 php开源项目日报 Top9

根据Github Trendings的统计,今日(2025-02-23统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9JavaScript项目2Shell项目1TypeScript项目1Blade项目1Java项目1ASP项目1Vue项目1Laravel:表达力和优雅的 Web 应用程序框架 创建周期:…

使用大语言模型(Deepseek)构建一个基于 SQL 数据的问答系统

GitHub代码仓库 架构 从高层次来看&#xff0c;这些系统的步骤如下&#xff1a; 将问题转换为SQL查询&#xff1a;模型将用户输入转换为SQL查询。 执行SQL查询&#xff1a;执行查询。 回答问题&#xff1a;模型根据查询结果响应用户输入。 样本数据 下载样本数据&#xf…

AI学习之-阿里天池

阿里天池&#xff08;Tianchi&#xff09;是阿里巴巴集团旗下的一个数据科学与人工智能竞赛平台&#xff0c;致力于推动数据科学和人工智能的发展。在天池平台上&#xff0c;人们可以参与各种数据竞赛和挑战&#xff0c;解决实际问题&#xff0c;提升数据科学技能。天池平台提供…

数据库管理-第295期 IT架构与爆炸半径(20250221)

数据库管理295期 2025-02-21 数据库管理-第295期 架构与爆炸半径&#xff08;20250221&#xff09;1 术语新解2 硬件&#xff1a;存储VS本地盘3 数据库3.1 多模VS专用3.2 集中式VS分布式 4 公有云VS非公有云总结 数据库管理-第295期 架构与爆炸半径&#xff08;20250221&#x…

嵌入式 Linux:使用设备树驱动GPIO全流程

文章目录 前言 一、设备树配置 1.1 添加 pinctrl 节点 1.2 添加 LED 设备节点 二、编写驱动程序 2.1 驱动程序框架 2.2 编译驱动程序 三、测试 总结 前言 在嵌入式 Linux 开发中&#xff0c;设备树&#xff08;Device Tree&#xff09;和 GPIO 子系统是控制硬件设备的重要工具…