一站式讲解本地缓存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!

相关推荐
前端小巷子14 分钟前
Webpack 5模块联邦
前端·javascript·面试
前端双越老师15 分钟前
为何前端圈现在不关注源码了?
面试·前端框架·源码
江城开朗的豌豆24 分钟前
Vue和React中的key:为什么列表渲染必须加这玩意儿?
前端·vue.js·面试
小鱼人爱编程42 分钟前
Java基石--反射让你直捣黄龙
前端·spring boot·后端
hqxstudying1 小时前
J2EE模式---服务层模式
java·数据库·后端·spring·oracle·java-ee
GM_8281 小时前
【最新最完整】SpringAI-1.0.0开发MCP Server,搭建MCP Client 实战笔记(进阶+详细+完整代码)
java·后端·ai编程·springai·mcp
程序员爱钓鱼1 小时前
Go语言实战案例-滑动窗口最大值
后端·google·go
Victor3562 小时前
MySQL(163) 如何理解MySQL的隔离级别?
后端
Victor3562 小时前
MySQL(164)如何设置MySQL的隔离级别?
后端
代码老y3 小时前
ASP.NET Core 高并发万字攻防战:架构设计、性能优化与生产实践
后端·性能优化·asp.net