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


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


文章目录

    • [一、Redis 的前置配置](#一、Redis 的前置配置)
    • [二、创建 Redis 配置类](#二、创建 Redis 配置类)
      • [1、简易版 RedisConfig](#1、简易版 RedisConfig)
      • [2、复杂版 RedisConfig](#2、复杂版 RedisConfig)
    • [三、RedisTemplate 类](#三、RedisTemplate 类)
    • [四、创建 Redis 操作类](#四、创建 Redis 操作类)
    • [五、opsForValue 方法](#五、opsForValue 方法)
    • [六、在代码中使用 Redis](#六、在代码中使用 Redis)

一、Redis 的前置配置

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

1、引入依赖

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

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

2、单机配置

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

使用 application.properties 文件配置。

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

使用 application.yml 文件配置。

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

3、集群配置

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

yml 复制代码
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

java 复制代码
@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

java 复制代码
@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 中的操作方法封装起来,用于提供存储方法。

java 复制代码
@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 中的键值对进行各种操作。

java 复制代码
// 用于将指定的值存储到 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 。

java 复制代码
@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 缓存进行业务处理。

相关推荐
星辰徐哥5 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥5 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约5 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee5 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐5 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs5 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐5 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司5 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
一条小锦吕*5 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
Jinkxs5 小时前
Prometheus - 监控微服务:Spring Boot 应用指标暴露与监控
spring boot·微服务·prometheus