在Spring Boot项目中接入Redis主要分为以下几个步骤,包括依赖引入、配置连接、操作Redis等。下面详细介绍如何整合Redis到Spring Boot项目中。
1. 添加Redis依赖
在pom.xml
中引入Spring Data Redis和Lettuce(或Jedis)客户端依赖:
<!-- Spring Data Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Lettuce(默认客户端,基于Netty,高性能) -->
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</dependency>
<!-- 可选:如果需要Jedis客户端(传统阻塞式IO) -->
<!--
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
-->
2. 配置Redis连接
在application.yml
或application.properties
中配置Redis服务器地址、端口、密码等:
spring:
redis:
host: localhost # Redis服务器IP
port: 6379 # Redis端口
password: 123456 # Redis密码(若无密码可省略)
database: 0 # 默认DB索引(0-15)
lettuce:
pool: # 连接池配置(可选)
max-active: 8 # 最大连接数
max-idle: 4 # 最大空闲连接
min-idle: 1 # 最小空闲连接
3. 配置RedisTemplate(可选)
Spring Boot默认提供RedisTemplate
和StringRedisTemplate
,但默认使用JDK序列化(可读性差)。可以自定义序列化方式:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// Key使用String序列化
template.setKeySerializer(new StringRedisSerializer());
// Value使用JSON序列化
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
// HashKey/Value同样处理
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
4. 使用RedisTemplate操作Redis
在Service中注入RedisTemplate
,进行数据存取:
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class RedisService {
private final RedisTemplate<String, Object> redisTemplate;
public RedisService(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
// 存储数据
public void setValue(String key, Object value, long timeout) {
redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
}
// 获取数据
public Object getValue(String key) {
return redisTemplate.opsForValue().get(key);
}
// 删除数据
public void deleteKey(String key) {
redisTemplate.delete(key);
}
// 操作Hash
public void setHashValue(String key, String field, Object value) {
redisTemplate.opsForHash().put(key, field, value);
}
// 其他操作:List、Set、ZSet等类似
}
5. 使用StringRedisTemplate(简化版)
如果只需要操作字符串,可以直接使用StringRedisTemplate
(默认使用String序列化):
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class StringRedisService {
private final StringRedisTemplate stringRedisTemplate;
public StringRedisService(StringRedisTemplate stringRedisTemplate) {
this.stringRedisTemplate = stringRedisTemplate;
}
public void setString(String key, String value) {
stringRedisTemplate.opsForValue().set(key, value);
}
public String getString(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
}
6. 测试Redis连接
编写单元测试验证Redis是否正常工作:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Test
public void testRedis() {
redisTemplate.opsForValue().set("testKey", "Hello Redis!");
String value = (String) redisTemplate.opsForValue().get("testKey");
System.out.println(value); // 输出: Hello Redis!
}
}
7. 高级功能(可选)
(1) 发布/订阅(Pub/Sub)
// 发布消息
redisTemplate.convertAndSend("channel-name", "Message Content");
// 订阅消息(需配置MessageListener)
@Bean
public MessageListenerAdapter listenerAdapter(Receiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory factory, MessageListenerAdapter listener) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(factory);
container.addMessageListener(listener, new ChannelTopic("channel-name"));
return container;
}
(2) 分布式锁
使用Redisson或setIfAbsent
实现:
// 加锁(SETNX + 过期时间)
Boolean locked = redisTemplate.opsForValue().setIfAbsent("lockKey", "1", 10, TimeUnit.SECONDS);
if (locked) {
try {
// 执行业务逻辑
} finally {
redisTemplate.delete("lockKey"); // 释放锁
}
}
8:常见问题
-
连接失败:检查Redis服务是否启动,防火墙是否放行6379端口。
-
序列化错误:确保
RedisTemplate
的Key/Value序列化方式一致。 -
性能问题:合理配置连接池参数(如
max-active
)。
总结
-
基础步骤:引入依赖 → 配置连接 → 使用
RedisTemplate
操作数据。 -
生产建议:
-
使用连接池(Lettuce/Jedis)。
-
统一序列化方式(推荐JSON)。
-
对敏感操作(如分布式锁)添加重试机制。
-