🎬 HoRain 云小助手:个人主页
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
目录
⛳️ 推荐
🔰 核心概念:Spring Cache 与 Redis
⚙️ 项目配置步骤
📗 核心注解的使用
💡 进阶特性与注意事项
💎 实践建议
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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙