在Spring Boot中集成Redis进行缓存,主要分为以下步骤:
1. 添加依赖
在pom.xml
中添加Redis和缓存相关的依赖:
<!-- Spring Boot Redis Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 可选:对象序列化支持(如Jackson) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
2. 配置Redis连接
在application.properties
或application.yml
中配置Redis服务器信息:
# Redis基础配置
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password= # 若无密码则留空
spring.redis.database=0
# 连接池配置(可选)
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
3. 启用缓存功能
在启动类上添加@EnableCaching
注解:
@SpringBootApplication
@EnableCaching // 启用缓存
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4. 配置缓存管理器(可选但推荐)
自定义Redis缓存配置(如设置过期时间、序列化方式):
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
@Configuration
@EnableCaching
public class RedisCacheConfig {
@Bean
public RedisCacheConfiguration cacheConfiguration() {
return RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10)) // 默认缓存过期时间:10分钟
.disableCachingNullValues() // 不缓存null值
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(
new GenericJackson2JsonRedisSerializer() // 使用JSON序列化
)
);
}
}
5. 在Service层使用缓存注解
在需要缓存的方法上添加Spring Cache注解:
注解 | 作用 |
---|---|
@Cacheable | 查询时优先读缓存,无缓存则执行方法并保存结果 |
@CachePut | 每次执行方法并更新缓存(常用于更新操作) |
@CacheEvict | 删除缓存(常用于删除或更新操作) |
示例代码:
@Service
public class UserService {
// 根据ID查询用户(结果缓存到"users"区域,key为#id)
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
// 模拟数据库查询
return userRepository.findById(id).orElse(null);
}
// 更新用户信息(同时更新缓存)
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
return userRepository.save(user);
}
// 删除用户(同时移除缓存)
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
// 清除"users"区域所有缓存(如批量更新后)
@CacheEvict(value = "users", allEntries = true)
public void clearAllUserCache() {}
}
6. 验证缓存效果
- 观察日志:首次查询会访问数据库,后续相同请求不会打印SQL。
- Redis命令行检查:
redis-cli > KEYS * # 查看所有缓存键 > GET "users::1" # 查看key为1的用户缓存
- 强制刷新缓存:更新数据后,检查缓存是否被清除/更新。
常见问题解决
-
序列化异常:
- 确保实体类实现
java.io.Serializable
接口。 - 使用JSON序列化(如
GenericJackson2JsonRedisSerializer
)。
- 确保实体类实现
-
缓存穿透:
- 对空结果也进行短时间缓存(需自定义配置)。
- 使用
@Cacheable
的unless
参数:@Cacheable(value="users", unless="#result == null")
-
缓存一致性:
- 更新数据库后立即清除或更新缓存(通过
@CachePut
/@CacheEvict
)。
- 更新数据库后立即清除或更新缓存(通过
通过以上步骤,即可在Spring Boot中高效集成Redis实现缓存功能,显著提升应用性能。