Spring Boot 2.x 接入 Redis 教学与实战
- 发布时间:2025-11-13 05:52:01
- 本文热度:浏览 23 赞 0 评论 0
- 文章标签: Spring Boot Redis Java 后端
- 全文共1字,阅读约需1分钟
一、前言
在现代 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 性能优化建议
- 合理设置过期时间:防止内存被长期占用。
- 使用连接池(Lettuce 默认支持):提升并发性能。
- 分模块设置缓存前缀:避免键冲突。
- 使用 JSON 序列化:提升可读性。
- 使用 pipeline/batch 操作:批量操作减少网络开销。
- 监控命中率:利用
redis-cli info stats监控缓存命中率。
十、总结
通过本文的讲解,我们从零完成了 Spring Boot 2.x 接入 Redis 的全流程,涵盖了:
- Redis 基础连接与配置
- 序列化优化与模板配置
- 注解缓存机制
- 登录验证码缓存实战
- 分布式锁与消息队列实现
在实际项目中,Redis 不仅能提升性能,更能为系统提供更高的可扩展性与稳定性。掌握以上技巧,能让你的 Spring Boot 项目更加高效、健壮。