HoRain云--SpringCache与Redis高效整合指南
本文介绍了SpringCache与Redis整合的实用指南。主要内容包括:1)核心概念:SpringCache作为抽象层简化缓存操作,Redis提供高性能存储;2)配置步骤:添加依赖、配置Redis连接、启用缓存并设置JSON序列化;3)核心注解@Cacheable、@CacheEvict和@CachePut的使用场景与示例;4)进阶特性如防止缓存击穿、失效策略选择及常见问题解决方案;5)实践建议

🎬 HoRain 云小助手:个人主页
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
目录

Spring Cache与Redis的整合确实能大幅提升应用性能。下面是一个简明指南,帮你快速上手。
🔰 核心概念:Spring Cache 与 Redis
-
Spring Cache:这是Spring框架提供的缓存抽象层,它定义了一套统一的缓存操作接口。使用Spring Cache的好处在于,你可以通过简单的注解来管理缓存,而无需关心底层缓存的具体实现,使得代码更简洁且易于维护。
-
Redis:一个高性能的内存键值数据库,常被用作分布式缓存后端。当Spring Cache与Redis结合时,Redis就成为了缓存数据的实际存储位置。
这种组合让你能够用简单的注解来管理缓存,同时享受Redis高性能和分布式特性的好处。
⚙️ 项目配置步骤
将Spring Cache与Redis集成到Spring Boot项目中,只需几个关键步骤。
-
添加依赖:在
pom.xml中引入必要的依赖,主要是Spring Boot为缓存和Redis提供的Starter。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> -
配置Redis连接:在
application.yml或application.properties中配置Redis服务器的基础信息。spring: redis: host: localhost port: 6379 # password: your-password # 如果Redis设置了密码,需要配置此项 database: 0 -
启用缓存并自定义序列化:创建一个配置类,主要完成两件事:
-
使用
@EnableCaching注解开启缓存功能。 -
配置
RedisCacheManager,关键之一是设置序列化方式。默认的JDK序列化方式可读性差,通常建议改为JSON序列化(如Jackson)。
@Configuration @EnableCaching public class RedisConfig { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // Key使用字符串序列化 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value使用JSON序列化 .entryTtl(Duration.ofMinutes(30)) // 设置全局缓存过期时间 .disableCachingNullValues(); // 不缓存null值 return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).build(); } } -
📗 核心注解的使用
配置完成后,就可以在业务层(Service)的方法上使用缓存注解了。以下是三个最核心的注解:
|
注解 |
作用 |
适用场景 |
示例 |
|---|---|---|---|
|
|
将方法返回值存入缓存。后续调用相同参数时,直接返回缓存值,不执行方法体。 |
数据查询 |
|
|
|
从缓存中删除数据。 |
数据更新、删除 |
|
|
|
总是执行方法体,并用返回值更新缓存。 |
数据新增、强制更新 |
|
代码示例
@Service
public class UserService {
// 查询用户:如果缓存有则直接返回,没有则执行方法并缓存结果
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
// 模拟从数据库查询
return userRepository.findById(id).orElse(null);
}
// 更新用户:先更新数据库,然后清除缓存(失效模式)
@CacheEvict(value = "users", key = "#user.id")
public void updateUser(User user) {
userRepository.save(user);
}
// 新增用户:执行方法,并将结果放入缓存(双写模式)
@CachePut(value = "users", key = "#user.id")
public User addUser(User user) {
userRepository.save(user);
return user;
}
}
💡 进阶特性与注意事项
掌握基础使用后,了解这些进阶特性和常见问题能让你的缓存方案更稳健。
-
防止缓存击穿:对于热点数据,如果缓存恰好过期,大量并发请求可能瞬间压垮数据库。可以在
@Cacheable中设置sync = true属性,这样在缓存失效后,只有一个线程能去查询数据库,其他线程会等待。 -
缓存失效策略:处理数据更新时,通常有两种策略确保缓存与数据库的一致性:
-
失效模式(常用):使用
@CacheEvict,在更新数据后直接删除缓存。下次查询时自动从数据库加载最新数据并缓存。 -
双写模式:使用
@CachePut,在更新数据后同时更新缓存。这要求方法有返回值且是更新后的最新数据。
-
-
缓存相关问题:
-
缓存穿透(查询不存在的数据):可通过在配置中设置
cache-null-values: true来缓存空对象,防止反复查询数据库。 -
缓存雪崩(大量缓存同时失效):为不同的缓存设置随机的过期时间(TTL),避免同时失效。
-
💎 实践建议
-
缓存键(Key)设计:使用
key属性明确指定缓存键,避免使用默认生成规则可能导致的冲突。灵活运用SpEL表达式,如key = "#id"或key = "'user' + #user.id"。 -
序列化兼容性:使用JSON序列化(如
GenericJackson2JsonRedisSerializer)后,存储在Redis中的数据是可读的,并且更容易被其他非Java语言理解。
希望这份指南能帮助你顺利上手。如果在具体配置或注解使用中遇到问题,可以随时提出。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
更多推荐



所有评论(0)