如何在 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 缓存进行业务处理。

相关推荐
Flittly18 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
人活一口气1 天前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
Java陈序员2 天前
企业级!一个基于 Java 开发的开源 AI 应用开发平台!
spring boot·agent·mcp
杨运交2 天前
[041][公共模块]分布式唯一ID生成器设计与实现:一款灵活可扩展的雪花算法框架
spring boot
用户3074596982073 天前
Redis 延时队列详解
redis
烤代码的吐司君3 天前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
Flittly3 天前
【AgentScope Java新手村系列】(14)人机交互
java·spring boot·spring
Flynt4 天前
从Spring Boot 4.0升到4.1,我在Maven和gRPC上栽了跟头
java·spring boot·后端
掉鱼的猫5 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
leeyi5 天前
Checkpoint 机制:Agent 怎么在断电后接着跑
redis·aigc·agent