Spring框架学习之Cache抽象详解
作者:FantasyBaby 发布时间:2023-07-20 17:37:47
官方文档 8.0
Spring为不同缓存做了一层抽象,这里通过阅读文档以及源码会对使用以及原理做一些学习笔记。
1.简介
从3.1版开始,Spring Framework提供了对现有Spring应用程序透明地添加缓存的支持。 与事务支持类似,缓存抽象允许一致地使用各种缓存解决方案,而对代码的影响最小。
从Spring 4.1开始,通过JSR-107注释和更多自定义选项的支持,缓存抽象得到了显着改进。
cache和buffer
从术语上看,"buffer"和"cache",可以互相被替换.但是,他们确实代表着不同的事情.
传统上,一个buffer被用来作为快数据和慢数据之间的临时存储.因为快速的一方需要等待慢的一方(会影响性能),buffer通过允许整块数据一次移动而不是一小块数据一点一点移动来缓解压力. 这个数据只会从buffer中被写入或者读出一次.此外,buffers对总对一方可以见.
Cache,则相反,通过定义,隐藏,并且不会让对方意识到它的存在.它同样提高性能,但是这是让相同数据在同时以快速的方式被多次读取来实现的.
2.缓存抽象
缓存抽象的核心是将缓存应用于Java方法,从而减少了基于缓存中可用信息的执行次数。也就是说,每次调用目标方法时,抽象都会应用缓存行为检查方法是否已经为给定的参数执行。如果有,则返回缓存的结果,而不必执行实际的方法;如果没有,则执行方法,缓存结果并返回给用户,以便在下次调用方法时返回缓存的结果。这样,对于给定的一组参数,昂贵的方法(CPU或IO绑定)只能执行一次,并且结果可以重用,而不必实际再次执行该方法。缓存逻辑被透明地应用,没有任何对调用程序的干扰。
缓存抽象提供了其他缓存相关的操作,比如更新缓存的内容或者删除一个或者全部.如果缓存在处理数据的过程中经常改变,这些操作将非常有用.
就像Spring Framework中的其他服务一样,缓存服务是一种抽象(不是缓存实现),需要使用实际存储来存储缓存数据 - 也就是说,抽象使开发人员不必编写缓存相关逻辑,但它也不提供实际的数据存储能力。
通过接口 org.springframework.cache.Cache(缓存)
和org.springframework.cache.CacheManager(缓存管理器) 实现缓存的抽象
这个抽象的一些实现可以直接使用:基于JDK java.util.concurrent.ConcurrentMap的缓存(即默认的缓存是基于JVM的ConcurrentMap),Ehcache 2.x,Gemfire缓存,Caffeine,符合和JSR-107的缓存(例如Ehcache 3.x)。 有关插入其他缓存存储/提供程序的更多信息,请参阅插入不同的后端缓存。
3.spring缓存抽象与多进程
注意的是:
Spring的缓存抽象没有特别处理多线程或者多进程,这些都是缓存的实现来处理的。
如果你有多进程环境(一个应用部署在多个节点上),你需要配置相应地提供你缓存的程序.根据你的用例,从多个节点上拷贝相通数据就足够了.然而,如果在应用的过程中修改了数据,则需要有其他的机制来通知修改.
缓存一个专门的对象是一个与典型的get-if-not-found-then- proceed-and-put-eventually代码块等价,是通过编程缓存交互找到.没有锁被使用,多个线程并发的获取相同的数据.删除(eviction)也同样如此.如果多个线程尝试并发的更新或者删除数据,你也许就使用了过时(stale)的数据.一些缓存提供方提供了更加高级的特性.从文档中可以看到更多的细节.
使用缓存你需要从两方面看起:
声明缓存:确认需要被缓存的方法还有他们使用的策略
配置缓存: 存储数据然后把数据读到缓存中.
来源:https://blog.csdn.net/FantasyBaby/article/details/120400387
猜你喜欢
- 本文实例讲述了Android TextView中文字通过SpannableString设置属性的方法。分享给大家供大家参考,具体如下:在An
- properties和yml的区别这几天刚好看到Spring Boot当中有两种配置文件的方式,但是这两种配置方式有什么区别呢?proper
- 1.理解全过程1.1.概述需要具备的知识Socket网络编程反向代理的理解平滑加权轮询算法的理解线程池的理解目的:实现Socket 集群服务
- this:this理解为:当前对象 或 当前正在创建的对象可以调用的结构:属性、方法;构造器this调用属性、方法:先了解一下形参:形参的意
- PostMapping接收json参数后返回404问题描述js中传递json数据给后端,后端可以正常接收参数,但返回404。js
- WPF实现一个简单的多运算符表达式计算器,供大家参考,具体内容如下1.先看下效果图首先外围给了一个grid 把他分成了两行 第一行用来显示文
- 1、首先看一下下面两个sql语句的区别:<select id="selectByNameAndPassword"
- 使用poi生成excel通常包含一下几个步骤创建一个工作簿创建一个sheet创建一个Row对象创建一个cell对象(1个row+1个cell
- 看代码吧~package com.mtpc.admin.controller.exportSql;import ch.qos.logback
- 我们在j2ee当中,连接数据库的时候经常会用到properties配置文件,我们原来在eclipse或者myeclipse当中会在src文件
- 具体详细介绍请看下文:在使用文件进行交互数据的应用来说,使用FTP服务器是一个很好的选择。本文使用Apache Jakarta Common
- Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能Jenkins是基于Java开发的一种持续集成工具
- 这篇文章主要介绍了Spring JDK * 实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 第一次接触到随机数还是在c语言里面 使用的是 rand(); 但是重新执行一次的时候会发现,诶,居然和上一次执行的结果是一样的,因为没有初始
- 前言项目使用redis作为缓存数据,但面临着问题,比如,项目A,项目B都用到redis,而且用的redis都是一套集群,这样会带来一些问题。
- 为什么需要 StreamStream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 Output
- autoMapping和autoMappingBehavior的区别autoMappingBehaviormybatis核心配置文件中set
- 对于clear与new Map的区别。我们首先来看一个例子,本例子是我在实际开发中遇到的,需求就是讲map放入到list中,说白了就是lis
- 前言使用Java8的新特性Stream流式处理,可以提高对于集合的一些操作效率,再配合lambda表达式,可以极致的简化代码,尤其还有并行流
- Google 发布的Material Design支持库,对我们的APP设计有很大的影响,如果重新设计APP,支持库应该直接用V4提升到V7