百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Spring Boot3 整合 Redis,这些缓存注解你真的会用吗?

mhr18 2025-07-28 18:43 3 浏览 0 评论

你在开发 Spring Boot3 项目时,有没有遇到过这样的困扰?随着项目功能不断增加,数据量逐渐庞大,接口响应速度变得越来越慢,用户体验直线下降。好不容易找到优化方向 —— 引入 Redis 缓存,可在实际使用 Spring Boot3 与 Redis 整合的缓存注解时,却发现状况百出:缓存数据不生效、缓存更新不及时,甚至出现数据不一致的情况…… 别着急,这篇文章就是来帮你解决这些问题的!

开启缓存功能的第一步:@EnableCaching 注解

在使用缓存注解前,有一个关键步骤千万不能忘,那就是在 Spring Boot3 项目的主应用类或者配置类上加上@EnableCaching注解。这就好比打开缓存世界的大门,只有加上这个注解,后续的缓存注解才能生效。

例如,在你的 Spring Boot3 项目主类Application.java中,只需要添加一行代码:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

这样,Spring Boot3 项目就开启了缓存功能,为后续使用缓存注解做好了准备。

核心缓存注解详解

@Cacheable:查询场景的好帮手

@Cacheable注解用于标记一个方法的结果应该被缓存。当该方法被调用时,Spring 会先检查缓存中是否已经存在对应的结果,如果存在,就直接从缓存中返回数据,不再执行方法体,这样能大大减少数据库查询等耗时操作。

比如在一个用户管理模块中,我们有一个查询用户信息的方法:

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable(value = "user", key = "#p0.id")
    public User getUserById(User user) {
        // 这里原本可能是从数据库查询用户信息的逻辑
        // 假设通过复杂的SQL查询从数据库获取用户
        return userRepository.findById(user.getId()).orElse(null);
    }
}

这里的value指定了缓存的名称为 “user”,key = "#p0.id"则表示以方法第一个参数user的id属性作为缓存的键。也就是说,当你第一次调用getUserById方法查询某个用户信息时,结果会被存入 “user” 缓存中,之后再查询相同用户信息,就可以直接从缓存获取,无需再次执行从数据库查询的方法。

@CachePut:数据更新的守护者

@CachePut注解与@Cacheable有所不同。@CachePut是在方法执行后将返回值放入缓存,它不管缓存中是否已经存在数据,都会执行方法,然后将执行结果更新到缓存中。

这在数据更新场景非常有用,比如用户修改了个人信息。我们可以在更新用户信息的方法上加上@CachePut注解:

import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CachePut(value = "user", key = "#p0.id")
    public User updateUser(User user) {
        // 这里是更新用户信息到数据库的逻辑
        User updatedUser = userRepository.save(user);
        return updatedUser;
    }
}

这样每次修改用户信息后,缓存中的用户信息也会随之更新,保证了缓存数据与数据库数据的一致性。

@CacheEvict:缓存清理大师

@CacheEvict注解主要用于在数据修改或删除时,移除缓存中的旧数据。当你删除某个用户信息时,为了避免后续查询还从缓存中获取到已经删除的数据,就可以在删除方法上添加@CacheEvict注解:

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CacheEvict(value = "user", key = "#p0.id")
    public void deleteUser(User user) {
        userRepository.delete(user);
    }
}

这样就能精准地清除缓存中对应的数据;如果你想清空整个 “user” 缓存空间的数据,使用@CacheEvict(value = "user", allEntries = true)即可:

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CacheEvict(value = "user", allEntries = true)
    public void clearUserCache() {
        // 这里可以添加一些清理缓存前的业务逻辑
    }
}

缓存注解使用进阶技巧

除了掌握这些基本的缓存注解使用方法,在实际开发中,还有一些小技巧能让你更好地使用缓存注解。

合理设置缓存过期时间

为了避免缓存数据长期不更新导致数据陈旧,我们可以为缓存设置过期时间。在@Cacheable、@CachePut等注解中,可以通过cacheManager结合配置类来设置。

例如,在配置类中定义一个缓存管理器,并设置缓存的过期时间:

import org.springframework.cache.CacheManager;
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.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

import java.time.Duration;

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
               .entryTtl(Duration.ofMinutes(5)) // 设置缓存过期时间为5分钟
               .disableCachingNullValues()
               .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        return RedisCacheManager.builder(redisConnectionFactory)
               .cacheDefaults(cacheConfiguration)
               .build();
    }
}

应对缓存穿透、缓存雪崩等问题

缓存穿透是指查询一个一定不存在的数据,由于缓存不命中,每次都要去数据库查询,给数据库带来巨大压力。可以通过布隆过滤器等方式来过滤掉非法请求。

缓存雪崩是指大量缓存集中在同一时间失效,导致大量请求直接访问数据库。可以通过设置不同的缓存过期时间,避免缓存集体失效;也可以使用 Redis 的哨兵模式、集群模式来提高系统的可用性和稳定性。

总结

通过对 Spring Boot3 整合 Redis 的缓存注解的学习,相信你已经对如何优化项目性能有了更清晰的思路。从开启缓存功能的@EnableCaching注解,到核心的@Cacheable、@CachePut、@CacheEvict注解,再到使用缓存注解的进阶技巧,每一个环节都至关重要。

现在,不妨回到你的项目中,按照这些方法实践起来!如果你在使用过程中遇到了其他问题,或者有更好的经验和技巧,欢迎在评论区留言分享,大家一起交流学习,共同打造高性能的 Spring Boot3 项目!

相关推荐

软考架构师-案例分析之Redis(软考架构师真题)

软考架构师考试中,Redis的知识考了很多回,从最近几年来看,案例分析经常考,有的时候单独考,有的时候和其他知识点一起考。Redis过往的考试中,考过的知识如下:1、Redis特点,涉及数据类型、持久...

揭秘:视频播放网站如何精准记录用户观看进度

在互联网蓬勃发展的当下,视频内容已毫无争议地成为人们获取信息、享受娱乐休闲时光的核心方式。据权威数据统计,全球每天有数十亿小时的视频被观看,视频流量在网络总流量中的占比逐年攀升,预计在未来几年内将超过...

量子级一致性!Flink+Redis全局状态管理

百万级实时计算任务如何实现亚毫秒级状态访问?本文揭秘Flink+Redis的量子纠缠态状态管理方案,将状态延迟降至0.3ms。引子:实时风控系统的量子跃迁//传统Flink状态管理(基于RocksD...

在 Mac 上运行 Redis 的 Docker 容器

在Mac上运行Redis的Docker容器,你可以按以下步骤操作,非常简单高效:一、前提要求已安装DockerDesktopforMac可通过终端验证Docker是否可用:d...

从 0 到 1:使用 Nginx + Lua 打造高性能 Web 网关

在大规模分布式架构中,Web网关扮演着重要角色,负责请求转发、负载均衡、限流、认证等功能。而Nginx+Lua结合可以提供:o高性能:Nginx是目前最流行的高性能Web服务器o动...

外贸独立站缓存设置黑科技:用错Redis比没缓存更致命

上周帮一个杭州卖家排查网站崩溃问题,发现这老铁把Redis缓存设置成128MB还开着持久化,服务器内存直接炸得比春节红包还彻底——"你这哪是缓存啊,根本是DDoS攻击自己!"最近Clo...

Spring Boot3 整合 Redis,这些缓存注解你真的会用吗?

你在开发SpringBoot3项目时,有没有遇到过这样的困扰?随着项目功能不断增加,数据量逐渐庞大,接口响应速度变得越来越慢,用户体验直线下降。好不容易找到优化方向——引入Redis缓存...

MySQL处理并发访问和高负载的关键技术和策略

MySQL处理并发访问和高负载的关键技术和策略主要包括以下几个方面:一、硬件优化1.CPU:提升CPU处理能力可以明显改善并发处理性能。根据数据库负载,考虑使用更多的CPU核心。2.内存:增加内存可以...

druid解决高并发的数据库(druid多数据源配置 spring boot)

处理高并发的时候可以解决我们java一个核心问题java核心问题就是并发问题解决并发一个是redis一个是线程池的方式现在出来是个druid好像现在解决高并发的方式进行更换数据库的方式操作场景插入频繁...

高并发方案最全详解(8大常见方案)

关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen睿哥。高并发是大型架构的核心,下面我重点来详解常见8大高并发方案@mikechen文章来源:mikechen.cc分...

MySQL如何处理并发访问和高负载?(mysql如何处理并发访问和高负载访问)

MySQL在处理并发访问和高负载方面,采取了一系列关键技术和策略,以确保数据库系统在面对不断增长的并发需求时维持高效和稳定的性能。以下是对这些技术和策略的详细阐述,旨在全面解析MySQL如何处理并发访...

Redis高可用集群详解(redis高可用方案以及优缺点)

Redis集群与哨兵架构对比Redis哨兵架构在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具监控master节点状态,如果master节点异常,则会做主从切换,将某一台sla...

MCP协议重大升级!Spring AI联合阿里Higress,性能提升300%

引言:一场颠覆AI通信的技术革命2025年3月,MCP(ModelContextProtocol)协议迎来里程碑式升级——StreamableHTTP正式取代HTTP+SSE成为默认传输层。这一...

阿里三面被挂,幸获内推,历经5轮终于拿到口碑offer

作者:Java程序猿阿谷来源:https://www.jianshu.com/p/1c8271f03aa5每一个互联网人心中都有一个大厂梦,百度、阿里巴巴、腾讯是很多互联网人梦寐以求的地方,而我也不例...

来瞧瞧阿里一面都面些什么(笔试+机试)

絮叨说实话,能有机会面一下阿里对我来说帮助确实有蛮多,至少让我知道了自己的不足在哪,都说面试造火箭,上班拧螺丝。但就算是如此,为了生存,你也只有不停的学习,唯有光头,才能更强。哈哈起因2月28日在Bo...

取消回复欢迎 发表评论: