【Caffeine】⭐️SpringBoot 项目整合 Caffeine 实现本地缓存

目录

🍸前言

🍻一、Caffeine

🍺二、项目实践

        2.1 环境准备

        2.2 项目搭建

        2.3 接口测试

​💞️三、章末


🍸前言

        小伙伴们大家好,缓存是提升系统性能的一个不可或缺的工具,通过缓存可以避免大部分重复的请求到数据库层,减少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 中产生的缓存数据

 

 💞️三、章末

        文章到这里就结束了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/378036.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+VueJS+微信小程序技术的图书森林共享小程序设计与实现:7000字论文+源代码参考

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

Java面试八股之Redis哨兵机制

Redis哨兵机制 Redis Sentinel&#xff08;哨兵&#xff09;模式是一种高可用解决方案&#xff0c;用于监控和自动故障转移Redis主从集群。以下是对哨兵模式详细过程的描述&#xff1a; 1. 初始化与配置 部署哨兵节点&#xff1a;在不同的服务器上部署一个或多个Redis Sentin…

leetcode 周赛(406)全AC留念

纪念第一次 leetcode 周赛&#xff08;406&#xff09;全AC 1.(100352. 交换后字典序最小的字符串) 题目描述&#xff1a; 给你一个仅由数字组成的字符串 s&#xff0c;在最多交换一次 相邻 且具有相同 奇偶性 的数字后&#xff0c;返回可以得到的 字典序最小的字符串 。 如…

ubantu22.04安装OceanBase 数据库

1、管理员启动cmd,运行 sudo bash -c "$(curl -s https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/service/installer.sh)" 2、提示如下代表安装完成 3、修改数据库配置文件的密码 sudo vim /etc/oceanbase.cnf 然后保存退…

初学SpringMVC之 JSON 篇

JSON&#xff08;JavaScript Object Notation&#xff0c;JS 对象标记&#xff09;是一种轻量级的数据交换格式 采用完全独立于编程语言的文本格式来存储和表示数据 JSON 键值对是用来保存 JavaScript 对象的一种方式 比如&#xff1a;{"name": "张三"}…

Redis实战—附近商铺、用户签到、UV统计

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P88 - P95 目录 附近商铺 数据导入 功能实现 用户签到 签到功能 连续签到统计 UV统计 附近商铺 利用Redis中的GEO数据结构实现附近商铺功能&#xff0c;常见命令如下图所示。…

牛客TOP101:合并两个排序的链表

文章目录 1. 题目描述2. 解题思路3. 代码实现 1. 题目描述 2. 解题思路 与正常的合并两个有序数组思路一样&#xff0c;这里可以定义一个头节点&#xff08;虚拟节点&#xff09;&#xff0c;可以方便我们一开始进行连接。用两个指针标记两个链表的结点&#xff0c;进行循环比较…

5.4 软件工程-系统设计

系统设计 - 概述 设计软件系统总体结构 数据结构及数据库设计 编写概要设计文档、评审 详细设计的基本任务 真题

FPGA 项目菜单功能比较

为了帮助您更好地理解每个FPGA功能模块的实用场合、区别和特点&#xff0c;以下是详细的比较&#xff1a; 功能模块实用场合区别特点FPGA I/O自动控制系统、数据采集系统直接与FPGA板卡上的物理端口交互&#xff0c;配置和使用外部I/O设备灵活配置输入输出端口&#xff0c;支持…

[Spring] Spring Web MVC案例实战

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

「Pytorch」roLabelImg 图像异常旋转 bug

在进行Yolo-obb 模型训练的时候需要标注旋转框&#xff0c;roLabelImg 是比较推荐的一款旋转框标注工具&#xff0c;既可以标注正常的矩形框&#xff0c;还可以标注旋转框 roLabelImg Github 地址&#xff1a;https://github.com/HumanSignal/labelImg 但是在使用过程中遇到了…

数据库管理-第218期 服务器内存(20240711)

数据库管理218期 2024-07-11 数据库管理-第218期 服务器内存&#xff08;20240711&#xff09;1 内存2 ECC内存3 原理3.1 多副本传输3.2 纠错码3.3 汉明码 总结 数据库管理-第218期 服务器内存&#xff08;20240711&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文…

利用OSMnx进行城市路网数据的速度与通行时间推算及分析

本文还是以广州市路网为例&#xff0c;通过osmmx调用ox.add_edge_speeds(G)时&#xff0c;该函数会遍历图G 中的每条边&#xff08;即每条街道&#xff09;&#xff0c;并基于一些预设的规则或街道属性&#xff08;如街道类型、是否为主要道路、是否有速度限制等&#xff09;来…

Logistic回归算法原理详解及应用

目录 引言 基本原理 损失函数 参数估计 优缺点 应用 Logistic回归优化算法 具体案例 引言 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛用于分类问题的统计方法&#xff0c;尤其是二分类问题。尽管名字中有“回归”二字&#xff0c;但它实际上是一…

Vue3总结汇总(不间断更新)

一、常用依赖插件汇总 1.1 依赖 UI组件库:1、AntDesignVue2、ElementPlus 网络请求&#xff1a;axios 组件通信&#xff1a;mitt ID生成&#xff1a;nanoid 路由&#xff1a;vue-router 三维&#xff1a;cesium 构建工具:Vite vite-plugin-vue-setup-extend&#xff1a;简化set…

编译打包自己的云手机(redroid)镜像

前言 香橙派上跑云手机可以看之前的文章&#xff1a; 香橙派5plus上跑云手机方案一 redroid(带硬件加速)香橙派5plus上跑云手机方案二 waydroid 还有一个cuttlefish方案没说&#xff0c;后面再研究&#xff0c;cuttlefish的优势在于可以自定义内核且selinux是开启的&#xf…

推荐5个实用的可视化工具

面对海量的数据&#xff0c;我们应该如何高效地提取其价值&#xff0c;让复杂的信息一目了然&#xff1f;这正是可视化工具大显身手的舞台。今天&#xff0c;我就来分享几款非常好用的数据可视化工具&#xff0c;它们不仅能够帮助你轻松驾驭数据&#xff0c;还能让你的工作汇报…

HCIE是什么等级的证书?

HCIE&#xff08;华为认证互联网专家&#xff0c;Huawei Certified Internetwork Expert&#xff09;是华为认证体系中的最高等级证书。它要求考生具备在复杂网络环境中规划、设计、部署、运维和优化网络的能力。HCIE认证是华为认证体系中最具挑战性和含金量的认证之一&#xf…

鸿蒙语言基础类库:【@ohos.application.testRunner (TestRunner)】 测试

TestRunner TestRunner模块提供了框架测试的能力。包括准备单元测试环境、运行测试用例。 如果您想实现自己的单元测试框架&#xff0c;您必须继承这个类并覆盖它的所有方法。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-…

浪潮天启防火墙TQ2000远程配置方法SSL-V偏、L2xx 配置方法

前言 本次设置只针对配置V偏&#xff0c;其他防火墙配置不涉及。建议把防火墙内外网都调通后再进行V偏配置。 其他配置可参考&#xff1a;浪潮天启防火墙配置手册 配置SSLVxx 在外网端口开启SSLVxx信息 开启SSLVxx功能 1、勾选 “启用SSL-Vxx” 2、设置登录端口号&#xff0…