展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > SpringBoot整合缓存方式(Caffeine、Redis)

SpringBoot整合缓存方式(Caffeine、Redis)

SpringBoot通过注解驱动整合缓存,支持Caffeine本地缓存和Redis分布式缓存。核心注解包括@EnableCaching启用缓存,@Cacheable缓存方法结果,@CachePut更新缓存,@CacheEvict清除缓存。Caffeine需配置CacheManager设置过期时间和最大容量;Redis需自定义RedisTemplate和Cac

SpringBoot整合缓存

在实际项目中,缓存几乎是绕不开的一环。SpringBoot对缓存的支持非常友好,**注解驱动**的方式让你在几分钟内就能跑起来一个本地缓存或分布式缓存。本篇重点梳理两种常用方案:Caffeine(本地缓存)和 Redis(分布式缓存),顺便聊聊它们的适用场景和坑点。

注解介绍

Spring 缓存相关的核心注解有四个,理解它们各自的职责就好办了。

@EnableCaching

这个注解一般打在**缓存管理器配置类**上,配合 `@Configuration` 使用。它相当于告诉 Spring:“我要用缓存了,请开启自动袋里”。

@Cacheable

顾名思义,用于**查询**场景。当方法被调用时,Spring 会先根据 key 去缓存中找数据,找到就直接返回,不执行方法体;找不到就执行方法,并把结果存入缓存。注意:这里的 key 默认是方法参数组合,你也可以自定义。

@CachePut

这个注解用于**更新**操作。它**无论如何都会执行方法逻辑**,然后把返回结果更新到缓存中。适合那种即使缓存里有数据,也要强制刷新的场景。

@CacheEvict

用于**删除**操作。执行方法后,Spring 会直接清除对应的缓存条目。注意:它不会阻止方法执行,只是负责清缓存。

优缺点

- **优点**:零侵入、配置简单。不需要引入专业的缓存中间件也可以跑起来(比如直接用 Caffeine),非常适合快速集成。 - **缺点**:无法精细控制缓存行为。比如你想在 Redis 里做带业务逻辑的过期策略、或者针对不同缓存做不同的序列化方式,靠注解就不够灵活了,得自己写 `CacheManager` 的定制逻辑。

依赖

需要引入 Spring Boot、Caffeine 和 Redis 的相关依赖,下面是核心的 Ma ven 配置:


    org.springframework.boot
    spring-boot-starter-web
    2.6.8



    com.github.ben-manes.caffeine
    caffeine
    2.5.5



    org.springframework.boot
    spring-boot-starter-data-redis
    2.6.8


    redis.clients
    jedis
    3.7.1

配置文件yml

基本配置只需要指定 Redis 地址和端口,本地测试用默认的即可:
spring:
  redis:
    host: 127.0.0.1
    port: 6379
---

整合Caffeine

Caffeine 是 Gua va Cache 的升级版,性能优秀,适合做单机本地缓存。下面按步骤说明。

步骤

1. 配置 CacheManager

先创建一个配置类 `CachesConfig`,在里面声明一个 `CaffeineCacheManager` 的 `@Bean`,并指定缓存名称和过期策略。

SpringBoot整合缓存方式(Caffeine、Redis)

2. 在实现类中使用 @Cacheable

在 Service 实现类中,用 `@Cacheable` 注解指定 value(缓存名)和 cacheManager(指向上面定义的 Bean 名称)。这里有个关键点:如果你的配置类中定义了多个不同的 `CacheManager`,必须明确指定要用哪一个,否则 Spring 会报 Bean 冲突。解决办法有两个:要么用 `@Primary` 标记默认的那个,要么像下面这样在注解里写死 cacheManager。

SpringBoot整合缓存方式(Caffeine、Redis)

  • 其中 `value` 对应配置类中创建的缓存名称(如 `demoCache`),`cacheManager` 必填,指定注入的 `@Bean` 名字。
  • 之所以要这样,是因为如果 `CachesConfig` 中同时存在多个缓存引擎的 Bean(都实现了 `CacheManager` 接口),就必须要用 `@Primary` 或显式指定才能避免冲突。

3. 验证缓存效果

启动项目后,调用接口看看控制台输出。第一次会打印“模拟去db查询”,第二次就不会了,说明命中缓存。然后等缓存过期(本例设置 5 秒),再次调用,又会重新查询。

SpringBoot整合缓存方式(Caffeine、Redis)

SpringBoot整合缓存方式(Caffeine、Redis)

代码

**CachesConfig 配置类**
@Configuration
@EnableCaching
public class CachesConfig {
    @Bean(value = "getCaffeineCacheManager")
    public CaffeineCacheManager cacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        Cache cache = Caffeine.newBuilder()
                .expireAfterWrite(5, TimeUnit.SECONDS)
                .maximumSize(10_000)
                .build();
        cacheManager.registerCustomCache("demoCache", cache);
        return cacheManager;
    }
}
**CachesController 控制层**
@RestController
@RequestMapping(value = "cachesController")
public class CachesController {
    @Autowired
    private CachesService cachesService;
    @Autowired
    @Qualifier("getCaffeineCacheManager")
    private CaffeineCacheManager caffeineCacheManager;

    @GetMapping("playCaffeineCaches")
    public  T playCaffeineCaches() throws InterruptedException {
        System.out.println(cachesService.getFromDB(1));
        System.out.println(cachesService.getFromDB(1));

        // 校验缓存里的内容
        Cache demoCache = Objects.requireNonNull(caffeineCacheManager.getCache("demoCache"));
        String s = demoCache.get(1, String.class);
        System.out.println(s);
        // 由于设定Caffeine的过期时间为5s,检验超时后缓存是否失效
        TimeUnit.SECONDS.sleep(10);
        s = demoCache.get(1, String.class);
        System.out.println(s);
        return (T) s;
    }
}
**CacheServiceImpl 实现类**
@Service
@CacheConfig(cacheNames = {"com.devilvan.config.CachesConfig"})
public class CacheServiceImpl implements CachesService {
    @Cacheable(value = {"demoCache"}, cacheManager = "getCaffeineCacheManager", key = "#id")
    @Override
    public Object getFromDB(Integer id) {
        System.out.println("模拟去db查询~~~" + id);
        return "hello cache...";
    }
}
---

整合Redis缓存

Redis 作为分布式缓存,适合多实例共享的场景。整合方式和 Caffeine 类似,但需要多配置一个 `RedisTemplate` 和自定义的 `RedisCacheManager`。

步骤

1. 定义 RedisTemplate 的 Bean

虽然直接用 `RedisTemplate` 的默认配置也能跑,但通常我们会自定义序列化方式。下面是一个常见的配置。

SpringBoot整合缓存方式(Caffeine、Redis)

2. 配置 RedisCacheManager

在配置类中注入上面定义的 `RedisTemplate`,然后构造 `RedisCacheManager`。这里可以针对不同的缓存名称(`cacheNames`)指定不同的过期时间,非常灵活。

SpringBoot整合缓存方式(Caffeine、Redis)

3. 在实现类中使用注解

分别用 `@Cacheable`(查询)、`@CachePut`(更新)、`@CacheEvict`(删除)来标记对应的操作方法,并指定 cacheManager 为上面定义的 Bean。

SpringBoot整合缓存方式(Caffeine、Redis)

参数说明

cacheManager

指的是配置类中定义的 `CacheManager` 实现类 Bean 的名字。这里我们用的是 `empRedisCacheManager`。

cacheNames

就是缓存区域的名字。如果这个名字与配置类中 `withCacheConfiguration()` 方法里设置的名字匹配,就会使用该方法指定的独立配置(比如过期时间 60 秒 vs 120 秒)。

key

通常绑定方法参数,作为缓存的唯一标识。当 key 对应值不存在时,执行方法逻辑并写入缓存;存在则直接返回。

代码

**CachesConfig 配置类(Redis部分)**
/**
 * 自定义redisTemplate
 */
@Bean
public RedisTemplate empRedisTemplate(
        RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);
    // 转换 格式
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new StringRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setHashValueSerializer(new StringRedisSerializer());
    return template;
}

/**
 * 基于SpringBoot2 对 RedisCacheManager 的自定义配置
 */
@Bean("empRedisCacheManager")
@Primary
public RedisCacheManager empRedisCacheManager(@Autowired @Qualifier("empRedisTemplate") RedisTemplate redisTemplate) {
    RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
            .defaultCacheConfig()
            // 设置key为String
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getStringSerializer()))
            // 设置value 为自动转Json的Object
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()))
            // 不缓存null
            .disableCachingNullValues()
            // 缓存数据保存30s
            .entryTtl(Duration.ofSeconds(30));
    // 构造一个redis缓存管理器
    RedisCacheManager redisCacheManager = RedisCacheManager
            .RedisCacheManagerBuilder
            // Redis 连接工厂
            .fromConnectionFactory(Objects.requireNonNull(redisTemplate.getConnectionFactory()))
            // 设置默认缓存配置
            .cacheDefaults(redisCacheConfiguration)
            // 设置自定义缓存配置,缓存名为cache_user,它的过期时间为60s
            .withCacheConfiguration("cache_user", redisCacheConfiguration.entryTtl(Duration.ofSeconds(60)))
            // 上面默然缓存时间是1小时,但是可以根据cacheName来设置缓存时间
            .withCacheConfiguration("cache_post", redisCacheConfiguration.entryTtl(Duration.ofSeconds(120)))
            // 配置同步修改或删除 put/evict
            .transactionAware()
            .build();
    return redisCacheManager;
}
**CachesController 控制层(Redis部分)**
@GetMapping("playRedisCaches")
public  T playRedisCaches(@RequestParam("id") Integer id) {
    System.out.println(cachesService.getDept(id));
    System.out.println(cachesService.getDept(id));
    return (T) null;
}

@PostMapping("updateRedisCaches")
public  T updateRedisCaches(@RequestParam("id") Integer id) {
    System.out.println(cachesService.updateDept(id));
    System.out.println(cachesService.getDept(id));
    return (T) null;
}

@DeleteMapping("deleteRedisCaches")
public  T deleteRedisCaches(@RequestParam("id") Integer id) {
    cachesService.deleteDept(id);
    System.out.println(cachesService.getDept(id));
    return (T) null;
}
**CachesServiceImpl 实现类(Redis部分)**
@Cacheable(cacheManager = "empRedisCacheManager", cacheNames = {"dept"}, key = "#id")
@Override
public String getDept(Integer id) {
    System.out.println("查询"+ id  +"号部门。" );
    int i = new Random().nextInt(65535);
    int hashCode = String.valueOf((id + i)).hashCode();
    return "Do you like what you see?" + "-->" +hashCode;
}

@CachePut(cacheManager = "empRedisCacheManager", cacheNames = {"dept"}, key = "#id")
@Override
public String updateDept(Integer id) {
    System.out.println("更新"+ id  +"号部门。" );
    int i = new Random().nextInt(65535);
    int hashCode = String.valueOf((id + i)).hashCode();
    return "Do you like what you see?" + "-->" +hashCode;
}

@CacheEvict(cacheManager = "empRedisCacheManager", cacheNames = {"dept"}, key = "#id")
@Override
public void deleteDept(Integer id) {
    System.out.println("删除"+ id  +"号部门。" );
}

总结

这两套方案各有侧重:Caffeine 胜在轻量、极速,适合单机毫秒级响应;Redis 则强在共享和持久化,适合集群和跨进程缓存。实际项目中可以根据业务场景混合使用(比如热点数据放 Caffeine,低频数据放 Redis)。关键还是要理解注解背后的 `CacheManager` 机制,以及如何通过配置精细化控制过期时间、序列化方式。希望这份梳理能帮你快速上手,避开常见的坑。
本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。