一站式讲解本地缓存Caffeine😯

引言

上次我们讲了本地缓存guava,那么有没有比它更加优秀的本地缓存呢?有的,兄弟,有的。这次我们来讲本地缓存Caffeine。

本地缓存的必要性🤤

不是有了像redis这样的分布式缓存了吗,为什么还要本地缓存呢?因为本地缓存有这样的优势:

  1. 提升性能
  • 减少延迟:通过在应用层引入本地缓存作为第一级缓存(L1),可以直接在进程内部快速响应查询请求,而不需要每次都访问更慢的外部存储(如远程缓存或数据库)。这显著减少了响应时间。
  • 减少IO:由于本地缓存可以命中部分数据,减少了与分布式缓存的交互,也就减少了IO次数,进而减少了网络开销
  1. 减轻后端压力
  • 降低负载:多级缓存策略可以有效减少对后端数据库或其他外部服务的直接访问次数,从而减轻这些资源的压力,提高整体系统的稳定性和可用性。
  1. 增加缓存命中率
  • 优化缓存利用率:不同的缓存级别可以根据其特点存储不同热度的数据。例如,本地缓存可以存放最常访问的数据,而分布式缓存则用于存放相对较少访问但仍然重要的数据。这种方式能够最大化利用各个层级缓存的优势,提高整体缓存命中率。
  1. 容错能力增强
  • 提供冗余:当一个级别的缓存发生故障或失效时,其他级别的缓存仍然可以提供一定程度的服务,避免了单点失败带来的严重影响,提高了系统的容错能力和可靠性。
  1. 灵活性与可扩展性
  • 易于调整和扩展:根据业务需求的变化,可以灵活地调整各级缓存的大小、过期策略等参数,甚至添加新的缓存层次,以适应不断变化的工作负载。

多级缓存访问流程🥹

在多级缓存架构中,一般的设计模式是:

先查本地缓存(L1缓存) → 未命中则查分布式缓存(L2缓存) → 还未命中才查询数据库。

这种设计的目的在于兼顾性能与一致性

使用Caffeine作为本地缓存😶‍🌫️

首先要注意的是,Caffeine本身并不提供注解来使用缓存功能。Caffeine 提供了 newBuilder() API 来以编程方式配置和使用缓存。

所以我们这里可以使用Spring Cache 集成 Caffeine 的方式来使用Caffeine的本地缓存功能,这样非常方便,因为它允许通过注解来(如 @Cacheable、@CachePut 和 @CacheEvict)来声明性地配置缓存

添加Spring Cache 和 Guava 依赖

在pom文件添加以下依赖:确保版本号与你的项目兼容

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>

配置 Caffeine 缓存

和guava不同的是,guava需要配置类才可以使用注解开发,而caffeine由于和Spring高度结合,直接在yml文件进行配置即可

yml 复制代码
spring:
  cache:
    type: caffeine
    caffeine:
      spec: maximumSize=500,expireAfterAccess=60s

当然,你想使用配置类来实现更细粒度的控制或者有多个缓存管理器时,可以通过创建一个配置类来指定缓存管理器。

java 复制代码
@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        cacheManager.setCaffeine(caffeineCacheBuilder());
        return cacheManager;
    }

    Caffeine<Object, Object> caffeineCacheBuilder() {
        return Caffeine.newBuilder()
                .expireAfterWrite(60, TimeUnit.SECONDS)
                .maximumSize(100);
    }
}

在这个配置类中:

  • 使用了 @EnableCaching 注解启用缓存。
  • 定义了一个 cacheManager() 方法返回一个 CaffeineCacheManager 实例,并设置了 Caffeine 缓存构建器。
  • 在 caffeineCacheBuilder() 方法中,配置了缓存的有效期和最大容量等参数。

这种方式提供了更大的灵活性,允许你根据应用的需求定制缓存的行为。

启用缓存

如果你没有进行创建配置类,就需要在你的主应用程序类或配置类上添加 @EnableCaching 注解以启用缓存功能:

java 复制代码
@SpringBootApplication
@EnableCaching
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

使用缓存注解

现在你可以在你的服务层方法上使用 Spring 的缓存注解,比如 @Cacheable, @CachePut, 和 @CacheEvict 等等,以便根据需要控制缓存的行为。

java 复制代码
@Service
public class YourService {

    @Cacheable("books")
    public Book findBook(ISBN isbn) {
        // 方法逻辑...
    }
}

如果想要看详细的Spring缓存注解介绍,可以看我的关于guava本地缓存的介绍,因为已经讲过,这里就不再重复。

总结❤️

如果你看了这篇文章有收获可以点赞+关注+收藏🤩,这是对笔者更新的最大鼓励!如果你有更多方案或者文章中有错漏之处,请在评论区提出帮助笔者勘误,祝你拿到更好的offer!

相关推荐
锋行天下33 分钟前
服务器 Python 2.7 装不了 langgraph-cli?用本地生成 Dockerfile 曲线救国
人工智能·后端·python
桦说编程1 小时前
TransmittableThreadLocal 解读:从 CRR 机制到上下文所有权
java·后端·源码
喵个咪1 小时前
GoWind 拆解:全链 ID 类型体系——int64 定版与前端字符串化契约
前端·后端·go
喵个咪2 小时前
GoWind CMS 拆解:发布审批——多级推进、逐级角色与全程留痕
前端·后端·go
喵个咪2 小时前
GoWind Flow 拆解:一个 Go 工作流引擎与它的双模式设计器
前端·后端·go
喵个咪2 小时前
GoWind CMS 拆解:搜索三板斧——高亮、联想、同义词
后端·搜索引擎·go
喵个咪2 小时前
GoWind 拆解:AI Agent 编排引擎——波次并行、子图递归与人工审批
人工智能·后端·go
喵个咪2 小时前
GoWind Admin 拆解:打印模板设计器——从画布到服务端 PDF 的完整打印链路
前端·后端·go
喵个咪3 小时前
GoWind Admin 拆解:BI 大屏设计器——schema 即 JSON、resolver 注入与三张快照表的口径谱系
大数据·后端·go
喵个咪3 小时前
GoWind Admin 拆解:AI 能力层——工具循环、pgvector 知识库与机器凭证
人工智能·后端·agent