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

news2024/12/28 5:00:55

目录

🍸前言

🍻一、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.coloradmin.cn/o/1924351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【答疑】8080或其他端口被占用如何解决?

我们在做项目时总会遇到各式各样千奇百怪的问题&#xff0c;但基本上每个刚接触tomcat的小白早晚都会遇到一个问题——8080端口被占用&#xff1a; 报错信息很容易理解&#xff0c;端口8080已经被使用了&#xff0c;那么这时我们该如何知道是谁使用了这个端口并关掉它呢&#x…

c++基础语法之内联函数

引言&#xff1a; 在C编程中&#xff0c;性能优化是一个永恒的话题。内联函数&#xff08;Inline Functions&#xff09;作为提高程序执行效率的一种重要手段&#xff0c;在编译器优化过程中扮演着关键角色。 一、内联函数的基本概念 定义&#xff1a;内联函数是C中一种特殊…

C#可空类型与数组

文章目录 可空类型NULL合并运算符&#xff08;??&#xff09;数组数组声明数组初始化数组赋值数组访问多维数组交错数组数组类数组类的常用属性数组类的常用方法 可空类型 C#提供了一种特殊的数据类型&#xff0c;nullable类型&#xff08;可空类型&#xff09;&#xff0c;可…

k8s字段选择器

文章目录 一、概述二、基本语法三、支持的字段1、错误示例2、支持的字段列表 四、支持的操作符1、示例 五、跨多种资源类型使用字段选择器 一、概述 在Kubernetes中&#xff0c;字段选择器&#xff08;Field Selectors&#xff09;和标签选择器&#xff08;Label Selectors&am…

MySQL更新和删除(DML)

DML-修改数据 UPDATE 表名 SET 字段1 值1&#xff0c;字段2值2&#xff0c;....[WHERE 条件] 例如 1.这个就是把employee表中的这个name字段里面并且id字段为1的名字改为itheima update employee set nameitheima where id 1; 2.这个就是把employee这个表中的name字段和…

string 的完整介绍

1.string类 还记得我们数据结构学的串吗&#xff0c;现在在c中&#xff0c;我们有了c提供的标准库&#xff0c;它是一个写好的类&#xff0c;非常方便使用 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作stri…

被边缘化后:飞猪“摆烂”,庄卓然求变?

文&#xff1a;互联网江湖 作者&#xff1a;刘致呈 走向独立的飞猪&#xff0c;在最近两年是越来越放飞自我了。 从“酱香大床房”的硬蹭热度&#xff0c;到“攻城价”被京都威斯汀酒店声明“打假”&#xff1b; 从年初的大数据杀熟争议&#xff0c;到最近被12036退票点名&a…

VLM技术介绍

1、背景 视觉语言模型&#xff08;Visual Language Models&#xff09;是可以同时从图像和文本中学习以处理许多任务的模型&#xff0c;从视觉问答到图像字幕。 视觉识别&#xff08;如图像分类、物体保护和语义分割&#xff09;是计算机视觉研究中一个长期存在的难题&#xff…

据传 OpenAI秘密研发“Strawberry”项目

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

ollama + lobechat 搭建自己的多模型助手

背景 人工智能已经推出了快2年了&#xff0c;各种模型和插件&#xff0c;有渐渐变成熟的趋势&#xff0c;打造一个类似 hao123网站的人工智能模型入口&#xff0c;也变得有需求了。用户会去比较多个ai给出的答案&#xff0c;作为程序员想拥有一台自己的GPU服务器来为自己服务。…

GuLi商城-商品服务-API-品牌管理-统一异常处理

每个方法都加这段校验太麻烦了 准备做一个统一异常处理@ControllerAdvice 后台代码: package com.nanjing.gulimall.product.exception;import com.nanjing.common.exception.BizCodeEnum; import com.nanjing.common.utils.R; import lombok.extern.slf4j.Slf4j; import org…

【UE5.1】Chaos物理系统基础——06 子弹破坏石块

前言 在前面我们已经完成了场系统的制作&#xff08;【UE5.1】Chaos物理系统基础——02 场系统的应用_ue5&#xff09;以及子弹的制作&#xff08;【UE5.1 角色练习】16-枪械射击——瞄准&#xff09;&#xff0c;现在我们准备实现的效果是&#xff0c;角色发射子弹来破坏石柱。…

【算法】单调队列

一、什么是单调队列 单调队列是一种数据结构&#xff0c;其特点是队列中的元素始终保持单调递增或递减&#xff0c;主要用于维护队列中的最小值或最大值。 不同于普通队列只能从队头出队、队尾入队&#xff0c;单调队列为了维护其特征&#xff0c;还允许从队尾出队 不管怎么…

【学习笔记】4、组合逻辑电路(上)

数字电路的分类&#xff1a;组合逻辑电路&#xff0c;时序逻辑电路。本章学习组合逻辑电路。 4.1 组合逻辑电路的分析 给定的逻辑电路&#xff0c;确定其逻辑表达式&#xff0c;列出真值表&#xff0c;得到简化后的逻辑表达式&#xff0c;分析得到其功能。 3位奇校验电路 &…

OSPF.综合实验

1、首先将各个网段基于172.16.0.0 16 进行划分 1.1、划分为4个大区域 172.16.0.0 18 172.16.64.0 18 172.16.128.0 18 172.16.192.0 18 四个网段 划分R4 划分area2 划分area3 划分area1 2、进行IP配置 如图使用配置指令进行配置 ip address x.x.x.x /x 并且将缺省路由…

MQTT——Mosquitto使用(Linux订阅者+Win发布者)

前提&#xff1a;WSL&#xff08;Ubuntu22&#xff09;作为订阅者&#xff0c;本机Win10作为发布者。 1、Linux安装Mosquitto 命令行安装。 sudo apt-get install mosquitto 以上默认只安装了mosquitto的服务&#xff0c;不带测试客户端工具mosquitto_sub和mosquitto_pub。如…

持续学习中避免灾难性遗忘的Elastic Weight Consolidation Loss数学原理及代码实现

训练人工神经网络最重要的挑战之一是灾难性遗忘。神经网络的灾难性遗忘&#xff08;catastrophic forgetting&#xff09;是指在神经网络学习新任务时&#xff0c;可能会忘记之前学习的任务。这种现象特别常见于传统的反向传播算法和深度学习模型中。主要原因是网络在学习新数据…

全网最详细单细胞保姆级分析教程(二) --- 多样本整合

上一节我们研究了如何对单样本进行分析,这节我们就着重来研究一下如何对多样本整合进行研究分析! 1. 导入相关包 library(Seurat) library(tidyverse) library(patchwork)2. 数据准备 # 导入单样本文件 dir c(~/Desktop/diversity intergration/scRNA_26-0_filtered_featur…

基于TCP的在线词典系统(分阶段实现)(阻塞io和多路io复用(select)实现)

1.功能说明 一共四个功能&#xff1a; 注册 登录 查询单词 查询历史记录 单词和解释保存在文件中&#xff0c;单词和解释只占一行, 一行最多300个字节&#xff0c;单词和解释之间至少有一个空格。 2.功能演示 3、分阶段完成各个功能 3.1 完成服务器和客户端的连接 servic…

WAF基础介绍

WAF 一、WAF是什么&#xff1f;WAF能够做什么 二 waf的部署三、WAF的工作原理 一、WAF是什么&#xff1f; WAF的全称是&#xff08;Web Application Firewall&#xff09;即Web应用防火墙&#xff0c;简称WAF。 国际上公认的一种说法是&#xff1a;Web应用防火墙是通过执行一…