Spring Boot 2.x 接入 Redis 教学与实战

一、前言

在现代 Web 应用中,Redis 已成为后端开发的标配组件。无论是缓存热点数据、存储 Session、实现分布式锁,还是构建消息队列,Redis 都能极大提升系统性能与响应速度。

本文将以 Spring Boot 2.x 为基础,从零讲解 Redis 的接入方式与实战应用,帮助你从入门到掌握 Redis 在实际项目中的使用。


二、项目初始化与依赖引入

1. 创建项目

通过 Spring Initializr 生成项目,选择依赖:

  • Spring Web
  • Spring Data Redis
  • Lombok(可选)

或者手动在 pom.xml 中加入:

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

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

💡 Spring Boot 2.x 默认使用 Lettuce 作为 Redis 客户端(非阻塞,支持连接池)。如果需要使用 Jedis,可以手动替换依赖。


三、Redis 配置详解

application.yml 中配置 Redis 连接:

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456   # 若无密码,可省略
    database: 0
    timeout: 5000
    lettuce:
      pool:
        max-active: 10
        max-idle: 5
        min-idle: 1

测试连接

编写一个简单的测试类验证 Redis 是否正常连接:

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisConnectTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void testRedis() {
        stringRedisTemplate.opsForValue().set("test", "Hello Redis!");
        String value = stringRedisTemplate.opsForValue().get("test");
        System.out.println("读取Redis值: " + value);
    }
}

输出:

读取Redis值: Hello Redis!

说明连接成功。


四、RedisTemplate 与 StringRedisTemplate 区别

对象 说明 使用场景
StringRedisTemplate 键值都是字符串 简单 KV 场景
RedisTemplate<Object, Object> 可序列化对象 存储复杂对象

自定义 RedisTemplate 序列化器

Redis 默认使用 JdkSerializationRedisSerializer,可读性差,性能一般。推荐改为 Jackson JSON 序列化

@Configuration
public class RedisConfig {

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

        // JSON序列化配置
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);

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

        template.afterPropertiesSet();
        return template;
    }
}

五、缓存使用(@Cacheable)

Spring Boot 对 Redis 缓存有原生支持,只需开启缓存即可:

@SpringBootApplication
@EnableCaching
public class RedisApp {
    public static void main(String[] args) {
        SpringApplication.run(RedisApp.class, args);
    }
}

示例:缓存用户信息

@Service
public class UserService {

    private static final Map<Integer, String> MOCK_DB = new HashMap<>();

    static {
        MOCK_DB.put(1, "Alice");
        MOCK_DB.put(2, "Bob");
    }

    @Cacheable(value = "user", key = "#userId")
    public String getUserById(Integer userId) {
        System.out.println("查询数据库..." + userId);
        return MOCK_DB.get(userId);
    }
}

测试:

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public String getUser(@PathVariable Integer id) {
        return userService.getUserById(id);
    }
}

第一次请求 /user/1:输出 查询数据库...1;第二次请求命中缓存,不再打印。


六、实战案例一:登录验证码缓存

用户登录时,验证码往往有时效性,可以用 Redis 缓存:

@Service
public class CaptchaService {

    private static final String CAPTCHA_KEY = "login:captcha:";

    @Autowired
    private StringRedisTemplate redisTemplate;

    public void saveCaptcha(String uuid, String code) {
        redisTemplate.opsForValue().set(CAPTCHA_KEY + uuid, code, 3, TimeUnit.MINUTES);
    }

    public boolean verifyCaptcha(String uuid, String input) {
        String code = redisTemplate.opsForValue().get(CAPTCHA_KEY + uuid);
        return input.equalsIgnoreCase(code);
    }
}

使用场景:

  • 保存验证码 3 分钟
  • 过期自动清理

七、实战案例二:分布式锁实现

在高并发环境下,可能多个节点同时操作同一资源,可用 Redis 实现分布式锁:

@Service
public class RedisLockService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    public boolean tryLock(String key, String value, long expireTime) {
        Boolean success = redisTemplate.opsForValue().setIfAbsent(key, value, expireTime, TimeUnit.SECONDS);
        return Boolean.TRUE.equals(success);
    }

    public void unlock(String key, String value) {
        String storedValue = redisTemplate.opsForValue().get(key);
        if (value.equals(storedValue)) {
            redisTemplate.delete(key);
        }
    }
}

注意事项:

  • setIfAbsent 保证原子性
  • value 建议使用 UUID 区分不同线程
  • 更复杂场景可使用 Redisson

八、消息队列应用(发布订阅)

Redis 支持轻量级消息机制,可用于事件通知:

@Component
public class RedisMessageSubscriber implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] pattern) {
        System.out.println("收到消息: " + message.toString());
    }
}

@Configuration
public class RedisPubSubConfig {

    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory factory, RedisMessageSubscriber subscriber) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(factory);
        container.addMessageListener(subscriber, new ChannelTopic("chat"));
        return container;
    }
}

@RestController
public class MessageController {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @GetMapping("/send/{msg}")
    public String send(@PathVariable String msg) {
        redisTemplate.convertAndSend("chat", msg);
        return "发送成功";
    }
}

请求 /send/hello,控制台打印:

收到消息: hello

九、Redis 性能优化建议

  1. 合理设置过期时间:防止内存被长期占用。
  2. 使用连接池(Lettuce 默认支持):提升并发性能。
  3. 分模块设置缓存前缀:避免键冲突。
  4. 使用 JSON 序列化:提升可读性。
  5. 使用 pipeline/batch 操作:批量操作减少网络开销。
  6. 监控命中率:利用 redis-cli info stats 监控缓存命中率。

十、总结

通过本文的讲解,我们从零完成了 Spring Boot 2.x 接入 Redis 的全流程,涵盖了:

  • Redis 基础连接与配置
  • 序列化优化与模板配置
  • 注解缓存机制
  • 登录验证码缓存实战
  • 分布式锁与消息队列实现

在实际项目中,Redis 不仅能提升性能,更能为系统提供更高的可扩展性与稳定性。掌握以上技巧,能让你的 Spring Boot 项目更加高效、健壮。


正文到此结束
评论插件初始化中...
Loading...