Spring Cache 缓存

芋道源码 —— Spring Boot 缓存 Cache 入门 随着系统访问量的增加,数据库往往成为性能瓶颈。为了减少数据库的压力,提高系统的响应速度,我们可以通过缓存来优化系统性能。 阅读详情

Spring从版本3.1开始,支持透明地向现有的Spring应用程序添加缓存。与事务支持类似,缓存抽象允许一致地使用各种缓存解决方案,同时对代码的影响最小。

在Spring Framework 4.1中,缓存抽象得到了显着扩展,支持JSR-107注释和更多自定义选项。

Spring Cache默认使用ConcurrentMapCache实现存储

详情查看官网

注解说明

@Cacheable

用它来划分可缓存的方法,即结果存储在缓存中的方法,以便在后续调用(使用相同的参数)时返回缓存中的值,而不必实际调用该方法。在最简单的形式中,批注声明需要与带批注的方法关联的缓存的名称

@Cacheable("books")
public Book findBook(ISBN isbn) {...}

@CacheEvict

缓存抽象不仅允许填充缓存存储,还允许逐出。此过程对于从缓存中删除陈旧或未使用的数据非常有用。与 相反,划分执行缓存逐出的方法(即充当从缓存中删除数据的触发器的方法)。与其同级类似,需要指定一个或多个受操作影响的缓存,允许指定自定义缓存和密钥分辨率或条件,并具有一个额外的参数 (),该参数指示是否需要执行缓存范围的逐出,而不仅仅是条目逐出(基于密钥)。

@CacheEvict(cacheNames="books", allEntries=true) 
public void loadBooks(InputStream batch)

@Caching

有时,需要指定相同类型(如 或 )的多个批注,例如,因为条件或键表达式在不同缓存之间是不同的。 允许在同一方法上使用多个嵌套 、 和注释。

@Caching(evict = { @CacheEvict("primary"), @CacheEvict(cacheNames="secondary", key="#p0") })
public Book importBooks(String deposit, Date date)

@CacheConfig

到目前为止,我们已经看到缓存操作提供了许多自定义选项,并且可以为每个操作设置这些选项。但是,如果某些自定义选项应用于类的所有操作,则配置这些选项可能会很繁琐。例如,指定要用于类的每个缓存操作的缓存名称可以替换为单个类级定义。这就是发挥作用的地方。

@CacheConfig("books") 
public class BookRepositoryImpl implements BookRepository {

    @Cacheable
    public Book findBook(ISBN isbn) {...}
}

@EnableCaching

重要的是要注意,即使声明缓存注释不会自动触发它们的操作 - 就像Spring中的许多事情一样,该功能必须以声明方式启用(这意味着如果您怀疑缓存是罪魁祸首,您可以通过仅删除一个配置行而不是代码中的所有注释来禁用它)。

要启用缓存批注,请将该批注添加到其中一个类中:@EnableCaching@Configuration

@Configuration
@EnableCaching
public class AppConfig {
}

用法示例

1.新建springboot项目并启用缓存

@EnableCaching
@SpringBootApplication
public class DemoCacheApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoCacheApplication.class, args);
	}

}

2.新建Book对象

public class Book {

    private String id;
    private String isbn;
    private String title;

    public Book(String id, String isbn, String title) {
        this.id = id;
        this.isbn = isbn;
        this.title = title;
    }
		
	//Get and Set ....	
}    

3.Repository层

这里简单模拟数据库查询数据

public interface BookRepository {

    List<Book> findAll();

    boolean delBook(String id);

    Book updateBook(Book book);

}
@Repository
public class BookRepositoryImpl implements BookRepository {

    private static List<Book> books = new ArrayList<>();

    @PostConstruct
    private void init(){
        System.out.println("初始化books数据");
        books.add(new Book("1","第一部", "射雕英雄传"));
        books.add(new Book("2", "第二部", "射雕英雄传"));
        books.add(new Book("3", "第三部", "射雕英雄传"));
        books.add(new Book("4","第四部", "射雕英雄传"));
        books.add(new Book("5","第五部", "射雕英雄传"));
    }

    @Override
    public List<Book> findAll() {
        return books;
    }

    @Override
    public boolean delBook(String id) {
        List<Book> collect = books.stream().filter(book -> id.equals(id)).collect(Collectors.toList());
        return books.remove(collect.get(0));
    }

    @Override
    public Book updateBook(Book book) {
        List<Book> collect = books.stream().filter(dbook -> dbook.getId().equals(book.getId())).collect(Collectors.toList());
        books.remove(collect.get(0));
        books.add(book);
        List<Book> newBook = books.stream().filter(dbook -> dbook.getId().equals(book.getId())).collect(Collectors.toList());
        return newBook.get(0);
    }

}

3.Service层

public interface BookService {

    List<Book> findAll();

    boolean delBook(String id);

    Book updateBook(Book book);

}

缓存使用示例(get,put)

@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookRepository bookRepository;

    @Cacheable(value = "book_cache", unless = "#result == null")
    @Override
    public List<Book> findAll() {
        System.out.println("findAll 获取数据时间:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        return bookRepository.findAll();
    }

    @CacheEvict(value = "book_cache", key = "#id")
    @Override
    public boolean delBook(String id) {
        System.out.println("delBook 操作数据时间:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        return bookRepository.delBook(id);
    }

    @CachePut(value = "book_cache", key = "#book.id", unless = "#result == null")
    @Override
    public Book updateBook(Book book) {
        System.out.println("updateBook 操作数据时间:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        return bookRepository.updateBook(book);
    }

}

4.Controller层

用于接口测试查看效果

@RestController
public class BookController {

    @Autowired
    private BookService bookService;

    @GetMapping("books")
    public List<Book> findAll(){
        return bookService.findAll();
    }

    @PutMapping("books")
    public Book putBook(@RequestBody Book book){
        return bookService.updateBook(book);
    }

    @DeleteMapping("books/{id}")
    public boolean delBook(@PathVariable String id){
        return bookService.delBook(id);
    }

}
Spring Boot 中使用cache缓存的方法 Spring Cache是Spring针对Spring应用,给出的一整套应用缓存解决方案。下面小编给大家带来了Spring Boot 中使用cache缓存的方法,感兴趣的朋友参考下吧一、什么是缓存 CacheCache 一词最早来自于CPU设计当CPU要读取一个数据时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理;没有找到,就从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在... 阅读详情

相关推荐

Spring Cache简化缓存开发

目录 1 背景介绍 2 使用方式 3 常用注解 3.1 @Cacheable 3.2 @CachePut 3.3 @CacheEvict 3.4 @CacheConfig 3.5 @Caching 4 实战:Spring Cache整合redis缓存 4.1 CacheManager 缓存管理器 4.2 配置spring-boot-starter-cache 4.3 手动配置 4.4 开启缓存功能 @Cacheable({"…"})...

赵广陆 371

Spring Cache 总结

SpringCache1、配置2、注解`@EnableCaching` (开启缓存功能)`@Cacheable` (将数据保存到缓存)1、key参数设置,SpringEl表达式2、其他参数示例`@CacheEvict` (将数据从缓存删除)`@CachePut ` (不影响方法执行更新缓存)`@Caching` (组合多个缓存操作)`@CacheConfig` (在类级别共享缓存的相同配置) 1、配置 1、依赖 <!--springcache依赖--> <depende

qq_48721706的博客 2313

《点亮创新灯塔!AI应用架构师与中小学初等教育AI智能体,共筑智能化教育辅助创新灯塔》

中小学AI智能体,是基于AI技术,能感知教育场景、理解教育规律、辅助教师教学和学生学习的智能系统。做老师“做不了”的事:比如5分钟批改45本作业,精准统计每个学生的易错点;做老师“做不好”的事:比如根据学生的学习风格(视觉/听觉/动觉)推荐个性化内容;绝不做老师“该做的事”:比如情感交流、价值观引导、创意教学设计——这些“人的温度”,AI永远无法替代。我是林宇,资深AI应用架构师,专注教育AI领域8年,参与过10多个中小学AI智能体项目,曾为北京、上海、深圳等城市的100多所学校提供AI教育解决方案。

Java大师兄的博客 433

从头认识Spring Cache

概述: Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果。 Spring Cache特点: Spring 的缓存技术还具备相当的灵活性,不

乐于学习、乐于分享、乐于总结 2580

使用LogisticRegression和LightGBM模型对信贷违约进行预测----基于kaggle比赛数据

3.分离数值型变量与类别型变量,发现有些数值型变量因为输入不规范,比如数值中含有字符(28_,_10000_等)被划分为类别型变量 ,比如 'Age','Annual_Income','Num_of_Loan', 'Num_of_Delayed_Payment', 'Changed_Credit_Limit','Credit_Mix','Monthly_Balance', 'Outstanding_Debt' ,'Amount_invested_monthly'等。三、分箱,woe编码,计算IV值。

I_am_a_big_tiger的博客 1682

No Target Connected 错误时的一种情况

STM32的SWD烧录模式No Target Connected 错误的一种情况 STM32的SWD烧录模式No Target Connected 错误时的一种处理情况 这是我第一次烧板子的时候遇到的问题,在给板子download的时候出现了“No Target Connected”的错误,这里讲一种解决方法。不一定适用于全部状况,但是可以作为一种纠错方法。 打开 Options for Target… 1.首先点击Options for Target…这个像魔棒一样的按键打开,会出现这个页面 2.点击

Logan_CodeGou的博客 1万+

SpringCache通用缓存学习

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码。 Spring Cache只是提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口。

软件开发实战项目分享 876

Hyper-V创建Ubuntu虚拟机设置固定IP

本文记录使用hyper-v创建ubuntu虚拟机,为虚拟设置固定IP且通过物理机可访问。

2623

Springboot使用@Cacheable注解实现数据缓存

本文介绍如何在Springboot中通过@Cacheable注解实现数据缓存。在每次调用添加了@Cacheable注解的方法(需要缓存功能的方法)时,Spring 会检查指定参数的指定目标方法是否已经被调用过,如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。

sg_knight的专栏 2684

【从零开始玩量化1】AKShare: Python开源财经数据接口库

文章目录量化的第一步:数据AKShare介绍AKShare安装AKShare使用AKTools安装/使用结语 量化的第一步:数据 想要玩量化,第一步要有数据,这个数据可能是历史交易数据、财务数据、宏观数据等等。我们最终要做的,无非就是从数据中分析出有价值的信息,以便用来指导投资策略。 在获取数据的这条道路上,我走了很多弯路,尝试了各种方法:使用Tushare到放弃、自己写网易股票页面的爬虫,自己写申万行业数据的爬虫、自己写同花顺问财的爬虫、使用聚宽的免费数据API等等,直到最终,我发现了AKShare。 A

量化投资助手的博客 5万+

ZeroClaw安装、使用方法详细全解

ZeroClaw 是一个用 Rust 编写的轻量级、高性能、完全自主的 AI 助手运行时框架

洛星核的博客 618

缓存-SpringCache-整合&体验@Cacheable

概述 使用 Spring Cache 可以极大的简化我们对数据的缓存,并且它封装了多种缓存,本文基于 redis 来说明。 基本使用 所需依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <de

Leon_Jinhai_Sun的博客 493

YOLOv12改进策略【Neck】| 使用CARAFE轻量级通用上采样算子

CARAFE内容感知的特征重新组合。

Limiiiing的博客 664

Spring Cache 实现缓存

通过以上步骤,你可以在 Spring 应用程序中使用 Spring Cache 实现缓存功能。使用缓存注解可以方便地对方法的返回值进行缓存、更新和清除操作,从而提高应用程序的性能和响应速度。

qq_48763502的博客 1017

基于FPGA的多通道音频信号采样系统设计

FPGA是随着数字集成电路的发展而逐步演变而来的。从早期的电子管、晶体管、小规模集成电路,到超大规模集成电路(VLSIC),数字集成电路的集成度和性能不断提升。FPGA的出现为系统设计师提供了灵活的设计平台,使其能够在不依赖半导体厂商的情况下快速设计专用集成电路(ASIC)。FPGA具有设计周期短、成本低、开发工具先进等优点,广泛应用于原型设计和产品生产中。VHDL是一种用于描述数字系统的硬件描述语言,其语言形式类似于计算机高级语言,但包含了许多硬件特征语句。

qq_62634009的博客 709

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

spring cache注解@Cacheable缓存穿透

最近发现线上监控有个SQL调用量很大,但是方法的调用量不是很大,查看接口实现,发现接口是做了缓存操作的,使用Spring cache缓存注解结合tair实现缓存操作。但是为啥SQL调用量这么大,难道缓存没有生效。测试发现缓存是正常的,分析了代码发现,代码存在缓存穿透的风险。具体注解是这样的: @Cacheable(value = "storeDeliveryCoverage", key = "#s...

chengbinbbs的专栏 5938

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring之Cache——Spring缓存架构解读

Spring之Cache——Spring缓存架构解读 Spring之Cache架构 缓存架构的概述 缓存架构的实现 缓存架构的操作原理 Spring Cache 概述 接下来将对Spring的缓存模块进行解读,主要内容分为:缓存的介绍、缓存的实现、两个部分。由于应用部分在网上的教程比较多,例如采用redis等,这里就不再重复了,只讲解Cache架构。 一.缓存架构的概述 作用与功能 ...

rekingman的博客 2467

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Spring Cache】缓存数据

SpringCache是Spring框架提供的缓存抽象层,通过注解实现方法级缓存管理。核心注解包括:@Cacheable(查询缓存)、@CachePut(更新缓存)和@CacheEvict(删除缓存)。支持多种缓存实现(Redis、Caffeine等),通过CacheManager配置。文章还介绍了缓存穿透/击穿/雪崩的解决方案,并提供了包含数据库、Redis配置的完整实战案例,演示了增删改查操作中的缓存应用。通过@EnableCaching启用缓存功能,实现性能优化与业务解耦。

2301_78540522的博客 995

Spring之Cache缓存详解

前言 Spring的Cache缓存类似于java的JDBC。是定义了一套规范。第三方缓存需要实现这套规范,才能通过Spring API使用缓存功能。这套规范的核心接口是CacheManager和Cache。其中,CacheMananger是获取Cache的入口。Cache是实现缓存逻辑的接口。下面具体看这两个接口。 CacheManager 我们先看其源码: public interface CacheManager { /** * Get the cache associated with th

敲代码的小小酥的博客 6057

spring cache 本地缓存清除_spring的缓存(cache)本地

注:本文篇幅有点长,所以建议各位下载源码学习。(如需要请收藏!转载请声明来源,谢谢!)代码下载:https://gitee.com/hong99/spring/issues/I1N1DF什么是缓存(cache)?缓存简称cache,全称:即高速缓冲存储器(Cache Memory)。缓存分为:硬件缓存和软件缓存。硬件缓存有CPU、内存条、硬盘等...以内存条为主,可以参照:https:/...

weixin_39963744的博客 1876

cacheable怎么获取缓存值_Spring Cache缓存注解

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达 作者|成猿手册来源 | cnblogs.com/WangJpBlog/p/13389932.htmlSpring Cache缓存注解本篇文章代码示例在Spring Cache简单实现上的代码示例加以修改。只有使用public定义的方法才可以被缓存,而private方法、protected 方法或者使用default 修饰...

weixin_35968185的博客 4403

Spring-Cache缓存技术的使用

1.为什么要数据缓存? 一个程序的瓶颈在于数据库,因为内存的速度是大大快于硬盘的速度的。当我们需要重复的获取相同的数据时,一次又一次的请求数据库获取远程服务,会导致大量的时间浪费在数据库查询或者远程方法调用上,导致程序性能恶化,这便是数据缓存要解决的问题。 2.Spring-Cache缓存支持 Spring定义了org.springframework.cache.CacheManager和org.springframework.cache.Cache接口用来统一不同的缓存技术。其中CacheManag

ScholarTang的博客 1415

Spring Cache 之 缓存注解使用

前言SpringCache是SpringFramework3.1引入的新特性,提供了基于注解的缓存配置方法.SpringCache是SpringFramework3.1引入的新特性,提供了基于注解的缓存配置方法pom文件引入&lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&g...

vincent 7429

Spring Cache 缓存的使用

一句话说缓存缓存是一个能有效提升性能和节省资源的东西。Spring Cache 在Spring-context包下,所以引入了Spring Framework就可以使用Spring cache了,在maven项目中引入spring-context<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->

追寻水中桥 1964
上一篇: JVM 垃圾收集器选择
下一篇: Spring事务隔离级别与传播行为
l_learning
博客等级 码龄8年 15粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值