2、Spring Boot 3 如何使用 Redis 数据库,以及 Redis 操作客户端选择

【投稿赢 iPhone 17】「我的第一个开源项目」故事征集:用代码换C位出道! 10w+人浏览 1.6k人参与

Spring Boot 3 项目中集成和使用 Redis 是后端开发中的常见需求。下面我将从 使用方式、客户端选择、区别对比、推荐方案 四个方面为你详细讲解。


一、Spring Boot 3 中如何使用 Redis?

1. 添加依赖(Maven)

Spring Boot 3 默认使用 Lettuce 作为 Redis 客户端,推荐使用 spring-boot-starter-data-redis

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

<!-- 可选:如果你使用 JSON 序列化 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

⚠️ 注意:Spring Boot 3 要求 Java 17+,且不再支持 Jedis 作为默认客户端(但仍可手动引入)。


2. 配置 application.yml

spring:
  redis:
    host: localhost
    port: 6379
    password: yourpassword  # 如果有
    database: 0
    timeout: 5s
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: -1ms  # 永久等待

3. 使用 RedisTemplateStringRedisTemplate

✅ 推荐:注入 RedisTemplate 进行操作
@Service
public class UserService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void setUser(Long userId, User user) {
        redisTemplate.opsForValue().set("user:" + userId, user, Duration.ofMinutes(30));
    }

    public User getUser(Long userId) {
        return (User) redisTemplate.opsForValue().get("user:" + userId);
    }

    public void deleteCache(Long userId) {
        redisTemplate.delete("user:" + userId);
    }
}

🔍 提示:RedisTemplate 默认使用 JDK 序列化,存储的是二进制格式,不易读。建议自定义序列化方式。


4. 自定义序列化(推荐使用 JSON)

@Configuration
@EnableRedisRepositories
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // 使用 Jackson2JsonRedisSerializer 序列化对象
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LazyLoadingConfigurer.construct(om.getPolymorphicTypeValidator()), ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(om);

        // 设置 Key 和 Value 的序列化方式
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(serializer);
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);

        template.afterPropertiesSet();
        return template;
    }
}

这样存储的 Redis 数据是 可读的 JSON 格式,便于调试。


5. 使用 @Cacheable 注解(声明式缓存)

@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
    // 模拟数据库查询
    return userRepository.findById(id);
}

@CacheEvict(value = "users", key = "#id")
public void updateUser(User user) {
    userRepository.save(user);
}

需要开启缓存支持:

@SpringBootApplication
@EnableCaching
public class Application { ... }

二、Redis 操作客户端有哪些?区别是什么?

客户端简介特点适用场景
Lettuce基于 Netty 的高性能客户端,Spring Boot 2.x/3.x 默认线程安全、支持同步/异步/响应式、连接共享、资源消耗低✅ 推荐,尤其在 Spring Boot 项目中
Jedis老牌客户端,简单直接轻量、API 简单,但非线程安全(需连接池)适合简单项目或学习,不推荐在 Spring Boot 3 中作为主客户端
Redisson高级客户端,封装了分布式对象、锁、队列等提供分布式锁、分布式集合、延迟队列等高级功能复杂分布式场景(如分布式限流、分布式任务调度)

详细对比(Lettuce vs Jedis vs Redisson)

对比项LettuceJedisRedisson
线程安全✅ 是(单连接可多线程共享)❌ 否(每个线程需独立连接或使用连接池)✅ 是
连接模型基于 Netty,异步非阻塞同步阻塞 I/O基于 Netty,异步
资源消耗低(连接可共享)高(频繁创建连接)中等
功能丰富度基础操作 + Stream 等基础操作⭐⭐⭐⭐⭐(分布式对象、锁、服务等)
Spring Boot 支持✅ 官方默认集成⚠️ 需手动配置✅ 可集成,但非默认
学习成本中高
性能高(尤其高并发)高(但连接管理差)中等(功能多,有开销)

三、如何选择?推荐方案

✅ 推荐组合(Spring Boot 3 项目):

场景推荐客户端说明
普通缓存、数据存取Lettuce + RedisTemplateSpring Boot 默认,性能好,线程安全,易于集成
需要分布式锁、分布式集合、延迟队列Redisson提供 RLockRBlockingQueueRDelayedQueue 等高级功能
简单脚本或测试Jedis(仅学习)不推荐用于生产,除非遗留系统

🎯 推荐使用策略:

  1. 90% 场景:使用 Lettuce

    • 缓存、计数器、会话存储、简单消息队列(List/Stream)
    • 配合 RedisTemplateStringRedisTemplate
  2. 10% 复杂场景:引入 Redisson

    • 分布式锁(Redlock)
    • 分布式限流(RateLimiter)
    • 延迟任务(RDelayedQueue)
    • 分布式集合(RList、RMap)

💡 可以同时引入 Lettuce 和 Redisson,各司其职。


四、Redisson 使用示例(分布式锁)

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.24.1</version>
</dependency>
@Autowired
private RedissonClient redissonClient;

public void deductStock() {
    RLock lock = redissonClient.getLock("stock:lock");
    try {
        if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
            // 执行扣库存逻辑
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } finally {
        lock.unlock();
    }
}

五、总结:Spring Boot 3 中 Redis 使用建议

项目建议
客户端选择优先使用 Lettuce,复杂分布式功能用 Redisson
序列化使用 Jackson2JsonRedisSerializer,避免 JDK 序列化乱码
连接池Lettuce 默认支持连接池(通过 LettucePoolingConfiguration
缓存注解使用 @Cacheable@CacheEvict 简化代码
高可用配合 Redis 哨兵或集群使用,配置多个节点
监控可集成 Spring Boot Actuator + RedisHealthIndicator

下一步学习建议

你可以继续深入:

  • Redis 持久化(RDB/AOF)配置与原理
  • Redis 哨兵(Sentinel)和集群(Cluster)搭建
  • 缓存穿透、击穿、雪崩的解决方案(布隆过滤器、空值缓存、互斥锁)
  • Redis Stream 实现消息队列
  • Redis 与 Spring Cache 的深度整合
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值