SpringBoot整合Caffeine实现本地缓存的实践分享

 更新时间:2024年07月14日 08:55:24   作者:在比萨斜塔吃披萨  
缓存是提升系统性能的一个不可或缺的工具,通过缓存可以避免大部分重复的请求到数据库层,减少IO链接次数,提升整体的响应速率,本地缓存中比较常见的比如 Caffeine 缓存,这篇文章将结合具体的 Springboot 项目搭配 Caffeine 实现本地缓存的各种使用方式

前言

小伙伴们大家好,缓存是提升系统性能的一个不可或缺的工具,通过缓存可以避免大部分重复的请求到数据库层,减少IO链接次数,提升整体的响应速率;具体的缓存工具可以分为本地缓存和分布式缓存(比如 redis),优先使用本地缓存,因为一般情况下使用分布式缓存有点大材小用了;本地缓存中比较常见的比如 Caffeine 缓存,这篇文章将结合具体的 Springboot 项目搭配 Caffeine 实现本地缓存的各种使用方式

一、Caffeine

Caffeine 是一个现代化的 Java 缓存库,设计用于提供高性能和可伸缩性的本地缓存解决方案。适用于高并发以及快速访问数据的场景,因为内部实现了基于 ConcurrentHashMap 的数据结构,从而保证并发访问时的线程安全和高性能。

在 Spring Framework 中,通常通过 Spring Cache 抽象来使用 Caffeine 缓存,常用的注解包括:

@Cacheable

用于标记方法可以使用缓存。当方法被调用时,Spring 会首先检查缓存中是否存在对应的数据,如果存在则直接返回缓存中的数据,否则执行方法并将返回值存入缓存。

@CachePut

用于更新缓存中的数据。与 @Cacheable 不同的是,@CachePut 注解的方法始终会执行,并将执行结果存入指定的缓存中,适用于更新操作后需要同步更新缓存的场景。

@CacheEvict

用于从缓存中移除一个或多个条目。可以通过指定的 key 或条件来移除缓存中的数据,常用于执行删除操作后清除相应的缓存条目,以保证数据一致性。

二、项目实践

2.1 环境准备

后续测试是基于一个可运行的 SpringBoot 项目,通过 ApiPost 模拟请求测试缓存接口

2.2 项目搭建

2.2.1 依赖引入 + 配置

在项目的 pom.xml 文件中添加以下依赖,然后点击 Maven 刷新,Maven 会从配置的远程仓库中自动下载并导入依赖包

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-cache</artifactId>
	</dependency>
     <dependency>
        <groupId>com.github.ben-manes.caffeine</groupId>
        <artifactId>caffeine</artifactId>
        <version>2.5.5</version>
    </dependency>
 

在 .properties 配置文件中 加入以下配置,设置了缓存的类型以及自定义的缓存参数,比如过期时间

spring.cache.type=caffeine
spring.cache.caffeine.spec=initialCapacity=10,maximumSize=200,expireAfterWrite=30s

另外不要忘了在启动类上加开启缓存的注解

2.2.2 测试接口

因为 Caffeine 常用的注解有三个,所以这里三个测试接口分别测试每种注解的使用

第一个测试接口对应的是 @Cacheable 注解的使用,value 指明缓存的名称为 data , key 利用 Spring EL 表达式与请求参数中的 "s" 相关联,方法作用就是打印当前时间

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.time.LocalDateTime;
 
/**
 * @author HuangBen 
 */
@RestController
@RequestMapping("/cache")
public class CachController {
 
    @Cacheable(value = "data",key = "#s")
    @GetMapping("/get")
    public String getData(String s){
        LocalDateTime now = LocalDateTime.now();
        String time = now.toString();
        System.out.println("查询到数据:"+ time);
        return " 查询到数据 :" + time;
 
    }
 
    @CachePut(value = "data",key = "#s")
    @GetMapping("/put")
    public String putData(String s){
        LocalDateTime now = LocalDateTime.now();
        String time = now.toString();
        System.out.println("存储数据:"+ time);
        return " 存储数据 :" + time;
 
    }
 
    @CacheEvict(value = "data",key = "#s")
    @PostMapping("/rem")
    public String remData(String s){
        LocalDateTime now = LocalDateTime.now();
        String time = now.toString();
        System.out.println("清除数据 :"+time);
        return " 清除数据 :" + time;
    }
 
}

2.3 接口测试

2.3.1 测试 @Cacheable 注解

通过模拟请求,可以看到成功创建缓存,并且在三十秒内重复请求的话,直接返回缓存中的数据并不会重新执行方法体,从控制台只打印了一条日志也可以体现

2.3.2 测试 @CachePut 注解

@CachePut 注解的特性就是每次都进到方法体,然后执行结束后会进行缓存刷新,这一点可以从测试 @Cacheable 注解体现,执行完一次 cacheput 操作后,之前的接口返回的缓存也是 CachePut 接口产生的数据

2.3.3 测试 @CacheEvict 注解

@CacheEvict 注解的主要作用是清除指定的缓存,通常用于删除数据的业务逻辑之后,一并清除缓存;这里可以通过控制台信息体现,先使用 Cacheput 操作产生缓存,然后调用 CacheEvict 清除缓存,再通过 Cacheable 操作查询缓存,结果显示并未查询到 CachePut 中产生的缓存数据

三、章末

以上就是SpringBoot整合Caffeine实现本地缓存的实践分享的详细内容,更多关于SpringBoot Caffeine本地缓存的资料请关注脚本之家其它相关文章!

相关文章

  • Java开发之内部类对象的创建及hook机制分析

    Java开发之内部类对象的创建及hook机制分析

    这篇文章主要介绍了Java开发之内部类对象的创建及hook机制,结合实例形式分析了java基于hook机制内部类对象的创建与使用,需要的朋友可以参考下
    2018-01-01
  • 浅谈java+内存分配及变量存储位置的区别

    浅谈java+内存分配及变量存储位置的区别

    下面小编就为大家带来一篇浅谈java+内存分配及变量存储位置的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Java判空的一些常见方法

    Java判空的一些常见方法

    这篇文章主要给大家分享介绍了Java判空的一些常见方法,在程序中必须进行严格的判空处理,避免对空对象的异常操作,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • SpringBoot Controller中的常用注解

    SpringBoot Controller中的常用注解

    这篇文章主要介绍了SpringBoot Controller中的常用注解,文章围绕主题展开详细的内容介绍,具有有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 基于Java实现双向链表

    基于Java实现双向链表

    这篇文章主要为大家详细介绍了基于Java实现双向链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • java学习之路_篇超好的文章

    java学习之路_篇超好的文章

    一篇超好的文章!就看你有没耐心看!java学习之路!
    2008-10-10
  • 使用dom4j解析xml文件,并转出json格式问题

    使用dom4j解析xml文件,并转出json格式问题

    这篇文章主要介绍了使用dom4j解析xml文件,并转出json格式问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 最有价值的50道java面试题 适用于准入职Java程序员

    最有价值的50道java面试题 适用于准入职Java程序员

    这篇文章主要为大家分享了最有价值的50道java面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,对hashCode方法的设计、垃圾收集的堆和代进行剖析,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • IDEA2022.1创建maven项目规避idea2022新建maven项目卡死无反应问题

    IDEA2022.1创建maven项目规避idea2022新建maven项目卡死无反应问题

    这篇文章主要介绍了IDEA2022.1创建maven项目规避idea2022新建maven项目卡死无反应问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • jvm垃圾回收之GC调优工具分析详解

    jvm垃圾回收之GC调优工具分析详解

    这篇文章主要为大家介绍了jvm垃圾回收之GC调优工具的分析详解,在进行JVM GC性能调优之前,需要使用某些工具获取到当前应用的状态信息
    2022-01-01

最新评论