@Cacheable(key = "user:" + #id) public User getUserById(Long id) { return userRepository.findById(id).orElse(null); } 这个注解直接帮你缓存用户数据,下次调用就从Redis里拿,超级快!网友说用这个后,接口响应时间从500ms降到50ms,效果炸裂。
实战案例一
在Spring Boot项目中,引入spring-boot-starter-data-redis依赖,然后开启缓存注解@EnableCaching。写个服务类,加@Cacheable(value="users", key="'user:' + #id"),查询数据库的用户信息自动缓存到Redis。测试时发现,第二次请求直接命中缓存,不走数据库,QPS提升3倍多。
实战案例二
@CacheEvict(value = "users", key = "'user:' + #id) public void deleteUser(Long id) { userRepository.deleteById(id); } 删除用户时自动清除对应缓存,避免脏数据。网友分享,用这个后系统稳定多了,以前缓存过期手动删太麻烦。
实战案例三
@Caching注解组合使用最强大:@Caching(put = {@Cacheable(value="user", key="#user.id")}, evict = {@CacheEvict(value="users", allEntries = true)}) 更新用户时,既缓存单个用户,又清空列表缓存。实际项目里,这个救了我一命,高并发下缓存一致性完美。
网友经验分享
小Tips:key要用SpEL表达式动态生成,避免固定key冲突。设置TTL用@Cacheable(unless="#result == null")过滤空值。Redis集群环境直接配JedisConnectionFactory,注解照用无压力。网友力荐,入门5分钟,收益一生!
配置要点
application.yml里加spring.redis.host=localhost,spring.redis.port=6379,然后RedisCacheManager配置序列化用Jackson2JsonRedisSerializer,避免默认JDK序列化乱码。启动类加@EnableCaching,一键搞定。
FAQ
Q: @Cacheable和@CachePut区别?
A: @Cacheable不执行方法直接返缓存,@CachePut总是执行方法并更新缓存。
Q: 缓存穿透怎么处理?
A: 加unless="#result == null",或用缓存空值策略。
Q: 多级缓存怎么用?
A: @Caching嵌套多个Cacheable指定不同namespace。
Q: Redis内存不够咋办?
A: 配置maxmemory-policy allkeys-lru自动淘汰。