学习之-Spring Cache缓存框架应用本地缓存

2023-11-17

此文章用于个人学习记录,原文地址:https://zhuanlan.zhihu.com/p/452315531

如果想了解springCache与redis的交互请看其他文章

缓存是web项目不可或缺的一部分,通过缓存能够降低服务器数据库压力,提高服务器的稳定性及响应速度。

Spring Cache介绍

spring cache是spring框架自带的一套缓存框架。是Spring 提供的一整套的缓存解决方案,它不是具体的缓存实现,它只提供一整套的接口和代码规范、配置、注解等,用于整合各种缓存方案,比如Caffeine、Guava Cache、Ehcache。

Spring Cache并不是缓存的实现,而是缓存使用的一种方式,其基于注解和Spring高级特性提供缓存读写以及失效刷新等各种能力

Spring Cache默认支持几个缓存实现,如下图jar包(spring-context-support 5.3.14版本)所示:

EhCache:纯Java进程内缓存框架,也是Hibernate、MyBatis默认的缓存提供。
Caffeine:使用Java8对Guava缓存的重写版本,从Spring5开始,Spring默认删除了Guava而使用Caffeine,支持多种缓存过期策略。
jcache:实现了JSR107规范的三方缓存都可以通过此包得到适配。

Spring Cache使用入门

Spring Cache依赖Spring的天然优势——AOP,我们只需要显式地在代码中调用第三方接口,在方法上加上注解,就可以实现把获取到的结果后把结果插入缓存内,在下一次查询的时候优先从缓存中读取数据。

使用Spring Cache也比较简单,简单总结就是3步:加依赖,开启缓存、加注解。

一、加依赖

maven:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

gradle:

implementation 'org.springframework.boot:spring-boot-starter-cache'

二、开启缓存

需要在启动类加上@EnableCaching注解才能启动使用Spring Cache,比如:

package com.tin.example;
​
import com.tin.example.service.MyGuavaCacheService;
import com.tin.example.service.SpringCacheService;
import com.tin.example.util.SpringContextUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
​
/**
 * title: Application
 * <p>
 * description:
 *
 * @author tin @【看点代码再上班】 on 2021/12/25 上午10:27
 */
@SpringBootApplication
@EnableCaching
public class Application {
    private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
​
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        LOGGER.info("容器启动成功... ");
​
        SpringCacheService springCacheService = SpringContextUtil.getBean(SpringCacheService.class);
        springCacheService.query();
​
//        MyGuavaCacheService myGuavaCacheService = SpringContextUtil.getBean(MyGuavaCacheService.class);
//        myGuavaCacheService.query();
    }
}

三、加注解

在需要缓存返回结果的方法上加上注解@Cacheable即可,比如:

接入Caffeine缓存实现框架

上文讲到了Spring Cache支持三种缓存实现,在使用我们上面所说"三步"引入使用Spring Cache,我们究竟使用的是哪种缓存实现呢?

通过CacheManager打印看一下:

ConcurrentMapCache是Spring 内置默认的缓存实现。如果需要使用CaffeineCache,需要额外引入CaffeineCache包,同时生成一个CaffeineCacheManager的bean。

maven依赖:

CaffeineCacheManager生成:

package com.tin.example.caffeine;

import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
​
import java.util.concurrent.TimeUnit;
​
/**
 * title: CaffeineCacheConfig
 * <p>
 * description:
 *
 * @author on 2021/12/26 下午2:47
 */
@Configuration
public class CaffeineCacheConfig {
    @Bean
    public CacheManager cacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        cacheManager.setCaffeine(Caffeine.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .initialCapacity(100)
                .maximumSize(10000))
        ;
        return cacheManager;
    }
}

配置完成后再运行就是这样的结果了:

常用注解

Spring Cache比较常用的几个注解:@Cacheable、 @CacheConfig、@CacheEvict、@CachePut、@Caching、@EnableCaching。spring-context依赖包下也能看到注解的定义。

除了CacheConfig只能用于类上,其余的都可以用在类或者方法上,用在方法上好理解,缓存方法结果,如果用在类上,就相当于对该类的所有可以缓存的方法(需要是public方法)加上注解。

@Cacheable

@Cacheble注解表示这个方法的结果可以被缓存,调用该方法前,会先检查对应的缓存key在缓存中是否已经有值,如果有就直接返回,不调用方法,如果没有,就会调用方法,同时把结果缓存起来。

@CacheConfig

有些配置可能又是一个类通用的,这种情况就可以使用@CacheConfig了,它是一个类级别的注解,可以在类级别上配置cacheNames、keyGenerator、cacheManager、cacheResolver等。

@CachePut

@CachePut注解修饰的方法,会把方法的返回值put到缓存里面缓存起来,它只是触发put的动作,和@Cacheable不同,不会读取缓存,put到缓存的值进程内其他场景的使用者就可以使用了。

@CacheEvict

@CacheEvict注解修饰的方法,会触发缓存的evict操作,清空缓存中指定key的值。

@Caching

@Caching能够支持多个缓存注解生效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习之-Spring Cache缓存框架应用本地缓存 的相关文章

随机推荐

  • oracle alter system命令使用

    我們可以利用alter system語句在數據庫咝羞 程中修改初始化參數的值 如果instance在啟動時使用的是文本初始化參數文件 那樣我們在利用alter system語句修改的初始化參數僅在當前的instance中有效 并且所做的修改
  • mac下安装mongoDB

    方式一 命令行 MongoDB的安装有好多种安装方法 有普通青年的HomeBrew方式 也有文艺青年的源码编译方式 我只想快速的装起来用一下 所以我选最简单的HomeBrew 请参考官方文档 http docs mongodb org ma
  • failed (2: No such file or directory)

    之前好好的 重启nginx时莫名的出现nginx emerg mkdir dev shm nginx temp client body failed 2 No such file or directory 解决办法 mkdir p dev
  • shell脚本命令

    Shell命令是在类Unix操作系统中使用的命令行解释器 shell 中执行的命令 Shell命令可以用于执行系统命令 操作文件 进行文本处理 管理进程等 以下是一些常见的Shell命令 1 ls 列出当前目录下的文件和文件夹 2 cd 切
  • 【.Net/C#之ChatGPT开发系列】四、ChatGPT多KEY动态轮询,自动删除无效KEY

    目录 ChatGPT多KEY轮询 一 Redis密钥管理 1 定义IChatGPTKeyService接口 2 实现IChatGPTKeyService服务 二 非依赖注入实现密钥轮换 1 取消IOpenAIService服务注册 2 取消
  • 解决VMware NAT service服务无法启动问题,VMware虚拟机的CentOS/Ubuntu无法上网的解决方法

    解决VMware NAT service服务无法启动问题 VMware虚拟机的CentOS Ubuntu无法上网的解决方法 今日使用VMware中的虚拟机CentOS 6 8 NAT模式 发现没有网络 新建了一个Ubuntu 14 04虚拟
  • Docker(三)实战:-Docker部署Golang项目并关联Mysql容器

    目录 前言 一 获取一个可执行的项目 1 拉取项目 2 配置 二 编写Dockerfile文件 1 作用 2 说明 1 FROM 2 WORKDIR 3 COPY 4 RUN 5 EXPOSE 6 ENTRYPOINT 三 构建Docker
  • Web服务器漏洞小结(中间件)

    IIS IIS是Windows Server中自带的一个Web服务器 IIS出现的漏洞 一 IIS目录解析漏洞 test asp 1 jpg IIS5 x 6 0 以 asp asa cer cdx 命名的文件夹 其目录内的任何扩展名的文件
  • 静态测试方法

    本文讨论人工静态测试方法和自动静态测试方法 来帮你理解研发流程上是如何保证代码质量的 以及如何搭建自己的自动静态代码扫描方案 并且应用到项目的日常开发工作中去 人工静态方法 人工静态方法检查代码错误 主要有代码走查 结对编程 以及同行评审这
  • leetcode Path Sum II

    python Definition for a binary tree node class TreeNode object def init self x self val x self left None self right None
  • Python量化交易:策略创建运行流程

    同学们前面两期量化交易内容 Python量化交易入门 量化交易的历史 Python量化交易项目怎么做 Python量化交易之回测框架介绍 文章目录 学习目标 一 体验创建策略 运行策略流程 1 1 创建策略 1 2 策略界面 二 策略界面功
  • [NOI 2015复习][BZOJ 1509][NOI 2003]逃学的小孩(树的直径)

    题目链接 http www lydsy com JudgeOnline problem php id 1509 题目大意 要从一棵树中找出三个点 X Y Z X Y Z 使得 min dis A C dis B C dis A B min
  • STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时

    参考 stm32 超声波模块 原理 实现测距 舵机使用 作者 点灯小哥 发布时间 2021 03 10 19 37 16 网址 https blog csdn net weixin 46016743 article details 1146
  • 利用Albumentations工具包进行图像的数据增强(以yolo数据标注格式为例)

    最近在看数据增强方法时 看到了这个有趣的工具包 研究了下并以yolo数据标注格式为例写了一个示例脚本 该工具最大的好处是会根据你使用的数据增强方法自动修改标注框信息 import albumentations as A import cv2
  • MySQL 数据类型

    整数类型 分类 类型 字节 范围 整数类型 TINYINT 1 128 127 SMALLINT 2 32768 32767 MEDIUMINT 3 8388608 8388607 INT INTEGER 4 2 31 2 31 1 BIG
  • JAVA数据库连接总结

    1 Oracle8 8i 9i数据库 thin模式 Class forName oracle jdbc driver OracleDriver newInstance String url jdbc oracle thin localhos
  • libuv异步文件读写

    libuv 异步文件读写 一 libuv编译环境 1 可查看另一篇 libuv 介绍与编译 http mp blog csdn net postedit 79193274 程序代码 include
  • 2022-04-30 Unity核心2——Sprite

    文章目录 一 Single 图片编辑 二 Multiple 图片编辑 三 Polygon 多边形编辑 四 Sprite Renderer 精灵渲染器 五 Sprite Creator 精灵创造者 六 Sprite Mask 精灵遮罩 七 S
  • Python语言基础—注释的作用及分类

    系列文章目录 Python语言基础 注释的作用及分类 Python语言基础 常用运算符总结 Python语言基础 定义变量与数据类型 Python语言基础 if判断和循环总结 Python语言基础 理解面向对象 Python语言基础 集合的
  • 学习之-Spring Cache缓存框架应用本地缓存

    此文章用于个人学习记录 原文地址 https zhuanlan zhihu com p 452315531 如果想了解springCache与redis的交互请看其他文章 缓存是web项目不可或缺的一部分 通过缓存能够降低服务器数据库压力