首页 > 其他分享 >Spring Cache 介绍

Spring Cache 介绍

时间:2024-04-21 20:11:21浏览次数:26  
标签:缓存 Spring Cache 介绍 注解 方法 id

Spring Cache 是 Spring 提供的的缓存解决方案,它并非是一个具体的缓存实现,而是和 JSR107 类似的一套缓存规范,基于注解并与 Spring 的无缝集成。本文主要介绍其基本概念及简单使用。

1、简介

1.1、Spring Cache 概述

Spring Cache 是 Spring 提供的一种缓存抽象机制,用于简化应用中的缓存操作。它通过将方法的返回值缓存起来,当下次调用同一方法时,如果传入的参数与之前的调用相同,就可以直接从缓存中获取结果,而不需要再执行方法体中的代码,提高了系统的性能和响应速度。

Spring Cache 的特点:
声明式缓存:通过在方法上添加注解,如 @Cacheable、@CachePut、@CacheEvict 等来声明缓存的行为,无需手动编写缓存代码。
多种缓存支持:Spring Cache 提供了对多种缓存框架的支持,包括 Redis、Ehcache、Guava Cache、Caffeine 等,可以根据需要选择合适的缓存实现。
缓存策略配置:可以通过配置文件或者编程方式来配置缓存的策略,包括缓存的过期时间、缓存的淘汰策略等。
注解灵活应用:通过在方法上添加不同的注解,可以实现缓存的读取、更新和清除等操作,根据业务需求进行灵活配置。
缓存切面自动代理:Spring Cache 通过 AOP 技术,利用代理模式在方法执行前后拦截,自动处理缓存相关的操作,对业务代码无侵入。

1.2、Spring Cache 注解

注解 说明
@Cacheable 标记在方法上,表示方法的返回值会被缓存。当方法被调用时,会先检查缓存中是否存在对应的结果,如果存在,则直接返回缓存中的值,如果不存在,则执行方法体,并将返回值缓存起来。
@CachePut 标记在方法上,表示方法的返回值会被缓存。不同于 @Cacheable,@CachePut 每次都会执行方法体,并将返回值缓存起来;它通常用于更新缓存。
@CacheEvict 标记在方法上,表示清除缓存项。通过设置不同的属性来清除的相应缓存项,通过 key 属性来清除特定键的缓存项,通过 allEntries 属性来清除所有缓存项。
@Caching 用于多个缓存操作的组合,可以同时使用 @Cacheable、@CachePut 和 @CacheEvict 等注解。
@CacheConfig 标记在类上,用于指定该类中所有方法的缓存相关配置,包括缓存名称、缓存管理器等。

这些注解通过声明式的方式来管理缓存,通过在方法上添加相应的注解,可以方便地实现缓存的读取、更新和清除等操作。同时,Spring Cache 还支持使用 SpEL 表达式来动态地指定缓存的 Key 和条件等。开发者可以根据具体的业务需求选择合适的注解来配置缓存行为。

2、Spring Cache 使用

Spring Boot 中使用 Spring Cache 大概有以下步骤。

2.1、引入相关依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.18</version>
    <relativePath />
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
</dependencies>

2.2、启用缓存

在启动类上添加 @EnableCaching 注解。

@SpringBootApplication
@EnableCaching
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

2.3、引入并配置具体的缓存实现

2.3.1、Caffeine 作为缓存实现

A、引入依赖

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>

B、配置缓存(application.yml)

spring:
  cache:
    type: caffeine
    caffeine:
      spec: maximumSize=1000,expireAfterWrite=3s

spec 的配置属性可参考 com.github.benmanes.caffeine.cache.CaffeineSpec 类。

2.3.2、JCache 作为缓存实现

JCache 也是缓存规范,这里使用 Ehcache3 作为其缓存实现。

A、引入依赖

<dependency>
    <groupId>javax.cache</groupId>
    <artifactId>cache-api</artifactId>
</dependency>
<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>

B、配置缓存(application.yml)

spring:
  cache:
    type: jcache
    jcache:
      config: classpath:ehcache3.xml

C、ehcache3 配置(ehcache3.xml)

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
        xmlns="http://www.ehcache.org/v3"
        xsi:schemaLocation="http://www.ehcache.org/v3
        http://www.ehcache.org/schema/ehcache-core-3.10.xsd
        http://www.ehcache.org/v3/jsr107
        http://www.ehcache.org/schema/ehcache-107-ext-3.10.xsd">

    <persistence directory="D:\temp"/>

    <cache alias="myCache">
        <key-type>java.lang.Integer</key-type>
        <value-type>java.lang.String</value-type>
        <expiry>
            <tti unit="minutes">5</tti>
        </expiry>
        <resources>
            <heap unit="MB">10</heap>
            <offheap unit="MB">50</offheap>
            <disk persistent="true" unit="MB">500</disk>
        </resources>
    </cache>
</config>

2.4、缓存使用

根据需要在方法上添加相应注解即可。

package com.abc.general.service.impl;

import com.abc.general.service.ICacheService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.*;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class CacheServiceImpl implements ICacheService {
    @Cacheable(cacheNames = "myCache", key = "#id")
    @Override
    public String queryById(int id) {
        log.info("queryById,id={}", id);
        return "value" + id;
    }

    @CachePut(cacheNames = "myCache", key = "#id")
    @Override
    public String updateById(int id, String newValue) {
        log.info("updateById,id={},newValue={}", id, newValue);
        return newValue;
    }

    @CacheEvict(cacheNames = "myCache", key = "#id")
    @Override
    public void deleteById(int id) {
        log.info("deleteById,id={}", id);
    }
}

 

标签:缓存,Spring,Cache,介绍,注解,方法,id
From: https://www.cnblogs.com/wuyongyin/p/18024683

相关文章

  • 短链接口设计&禁用Springboot执行器端点/env的安全性
    短链接口设计//短链接服务跳转方式,实现短链接转长链接的请求。@GetMapping("/{code}")publicStringredirectUrl(@PathVariable("code")Stringcode){return"redirect:"+shortUrl.getLongUrl();}禁用Springboot执行器端点/env的安全性#关闭健康检查不安全接口end......
  • Spring-Retry框架简单使用
    前言Spring-Retry框架是Spring自带的功能,具备间隔重试、包含异常、排除异常、控制重试频率等特点,是项目开发中很实用的一种框架。SpringCloudConfig请求配置中心服务器时就使用到了此功能,具体可以看ConfigServicePropertySourceLocator。使用添加依赖底层使用AOP实现的,......
  • 基于SpringBoot+Vue毕业生信息招聘平台系统
    需求分析3.1技术可行性:技术背景毕业生信息招聘平台是在Windows操作系统中进行开发运用的,而且目前PC机的各项性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的,也是当下广泛应用的技术之一。系统的开发环境和配置都是可以自行安装的,系统使用Java开......
  • 计算机毕业设计源码-基于 SpringBoot 开发的班级综合测评系统研究与实现
    技术栈开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9浏览器:谷歌浏览器3.需求分析用户需求分析根据账号登陆进入班级综合测评管理系统,系统根据角色展示相应......
  • springboot启动原理
     启动类上的注解,会扫描路径下的类进容器进行实例化。这样访问时springmvc的dispa就可以访问到这个类了。newDispatcherServlet(webapplication)springmvc需要一个web容器。这个容器参数,在startTomcat(applicationContext)方法里面传入。 ......
  • 面向对象设计介绍和代码示例
    面向对象设计(Object-OrientedDesign,OOD)是一种软件设计范式,它使用对象来表示数据和方法。面向对象设计原则是指导软件开发的一系列最佳实践,旨在提高代码的可维护性、可扩展性和可重用性。以下是几个核心的面向对象设计原则,以及它们的解释、应用场景和代码示例:1.单一职责原则(Si......
  • Redis介绍、使用、数据结构和集群模式总结
    Redis(RemoteDictionaryServer)是一个开源的,基于内存的数据结构存储系统,它支持多种数据结构,如字符串(String)、列表(List)、集合(Set)、有序集合(SortedSet)、散列(Hash)等。Redis不仅可以用作数据库、缓存和消息代理,还可以通过复制、持久化、高可用性和分区提供强大的数据保障。以下是关于......
  • Spring Cloud
    SpringCloud微服务概述微服务可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”。关键在于该服务可以在自己的程序中运行。通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一个API)区分开来。在服务公开中,许多服务都可以被内部独立进程所限......
  • Spring Boot 启动原理
    SpringBoot启动原理SpringBoot大大简化了我们的开发配置,节省了大量的时间,确实比较方便。但是对于新手来说,如果不了解个中原理,难免会遇到坑。本文作者将带领大家走近神秘的SpringBoot,一步步破开它的神秘面纱,探索SpringBoot的启动原理。开发任何基于SpringBoot的项目......
  • SpringCloud(七.7)ES(elasticsearch)-- 实战练习
    demo地址:链接:https://pan.baidu.com/s/16c1mMcQv7bF3Fcz2X_PE7A  提取码:msvy库表tb_hotel.sql: 链接:https://pan.baidu.com/s/1wVdh-fZoyeNbLUkyQYCD5g  提取码:3t4y 练习目标一:实现酒店搜索功能,完成关键字搜索和分页功能 如图,点击搜索按钮,我们发现它调用的是hot......