Spring 缓存

【白话Spring】三级缓存 容器只是个工具,怎么用才是我们需要了解的关键,什么时候给容器里存入Bean,把Bean存入哪个容器,什么时候清空容器,这就不得不了解一下Spring中Bean的生命周期了。设想一下没有三级缓存的循环依赖问题:ServiceA依赖ServiceB,ServiceB依赖ServiceA。每次获取到的都是新的代理对象,就破坏了Spring解决循环依赖问题的基础,即所有的对象都是单例的。解决循环依赖的问题有两级缓存就够了,为什么要用三级缓存呢?从上面的代码中可以看出,三级缓存就是3个全局的Map。 阅读详情

缓存简介

什么是缓存

缓存是存储在内存中的数据,相比硬盘读写更快。

缓存能做什么

主要就是减轻数据库压力,加快响应速度。

  • 预读取:在系统对外提供服务之前,提前将一部分热点数据从硬盘加载到内存,减少上线时服务器的压力。

  • 延迟写:数据库写入为了保证准确性所以很慢。可以将写入请求先堆积在缓存,之后一次批量写入数据库,可以缓解对数据库频繁修改的压力。只能用于对数据精度要求不高的场景,存在数据丢失的可能。

什么时候使用缓存

**1)业务流量量级以及应用规模:**对于低并发低流量的应用而言,引入缓存并不会带来性能的显著提升,反而会带来应用的复杂度以及极高的运维成本。

  1. 热点数据:每秒几十次以上的访问
  2. 静态数据:很少变化,读远大于写,如几天一变化
在哪里使用缓存

浏览器缓存 --》 CDN缓存 --》 网关(代理)缓存 --》 进程内缓存 --》 进程外缓存 --》 数据库缓存

从网关开始就是程序员自己能控制的了。常用的代理缓存有Nginx,Varnish(大量小文件),Squid(全面但成本高)。

进程内缓存:EhCache。相比于进程外缓存省去网络开销,响应时延更低。但数据存储多份(多个服务节点内)难保持一致性。

进程外缓存有:Redis(数据库结构更多),Memcached(纯kv且数据量大时会快一些,但可能丢失数据,是纯内存的)

使用缓存的弊端
  • 缓存更新
  • 缓存和数据的一致性
  • 缓存雪崩
  • 缓存穿透
  • 缓存并发
  • …

Spring 缓存

项目缓存—> Spring cache —> Spring EL表达式 —>

基于注解:
@Cacheable
  • 在方法被调用后,Spring会将返回值缓存起来,下次用同样的参数执行该方法时,直接从缓存取结果,不需要再执行方法。

  • 可以标注在方法上,表示方法支持缓存;可以标注在类上,表示类中所有方法支持缓存。

  • Spring是以键值对的方式缓存方法返回值的。

  • 有三个属性:value、key、condition

    • value:指定Cache名称,可以是多个(value={“cache1”,“cache2”})
    • key:指定返回结果时对应的key。Spring有默认生成key的策略。有提供root对象用于生成key。可以使用Spring EL表达式直接写。
    • condition:指定缓存发生的条件。使用Spring EL表达式来指定,当为true时进行缓存。
@CachePut
  • 不同于@Cacheable可能会不执行方法,@CachePut每次都会执行方法,并且把返回值放入缓存中。
  • 用法与@Cacheable一致。
@CacheEvict
  • 用来清除缓存的注解。可以标注在方法上和类上。
  • 有五个属性:value、key、condition、allEntries、beforeInvocation
    • value、key、condition用法与@Cacheable相似。
    • allEntries:表示是否需要清除缓存中的所有元素,为boolean类型。true的话将忽略指定的key,清除指定cache中的所有元素。
    • beforeInvocation:清除操作默认是在方法执行成功后执行的,如果方法抛出异常未成功返回,则不会清除缓存。此属性为true时,使得清除操作在方法执行前清除缓存中的元素。
@Caching
  • 使得可以在一个类或方法上同时指定多个Cache注解。
  • 有三个属性:cacheable、put和evict,分别对应三个注解。
基于XML配置:
  • <cache:advice 下定义多个 <cache:caching

  • <cache:caching 下定义多个 <cache:cacheable 、<cache:cache-evict 、<cache:cache-put

    <cache:advice id="cacheAdvice" cache-manager="cacheManager">
    
          <cache:caching cache="users">
    
             <cache:cacheable method="findById" key="#p0"/>
    
             <cache:cacheable method="find" key="#user.id"/>
    
             <cache:cache-evict method="deleteAll" all-entries="true"/>
    
          </cache:caching>
    
       </cache:advice>
    
  • 使用 <aop:config> 将<cache:advice 织入spring中。

配置Spring对Cache的支持
  1. 声明对Cache的支持
    1. 基于注解:<cache:annotation-driven/>
    2. 基于xml:即上面的
  2. 配置CacheManager
    1. Spring提供了两种CacheManager的实现。一种是基于Java API的ConcurrentMap,另一种是基于Ehcache。
    2. 配置<bean>即可,略。
键的生成策略
  1. 默认策略

    默认的生成策略是通过KeyGenerator生成的,默认如下:

    1. 如果方法没有参数,则使用0作为key;
    2. 如果方法有一个参数,则使用该参数为key;
    3. 如果方法有多个参数,则使用所有参数的hashCode作为key。

    也可以指定自己的KeyGenerator,配置略。

  2. 自定义策略

    我们通过Spring EL表达式来指定key。

    1. 直接使用 “#参数名” 或者 “#p参数索引”。如 key="#id",key="#p0"

    2. 使用Spring提供的root对象。

      属性名称描述示例
      methodName当前方法名#root.methodName
      method当前方法#root.method.name
      target当前被调用的对象#root.target
      targetClass当前被调用的对象的class#root.targetClass
      args当前方法参数组成的数组#root.args[0]
      caches当前被调用的方法使用的Cache#root.caches[0].name
补充:
  1. 使用@Cacheable不缓存空值。@Cacheable(value = "organCache", unless = "#result == null")
参考资料:
  1. Spring中Cache的使用
  2. Spring EL表达式
  3. 进程内缓存怎么玩
oscp备考,oscp系列——Djinn3靶场:ssti漏洞,pkexec提权 oscp备考,oscp系列——Djinn3靶场:ssti漏洞,pkexec提权难度简单偏上对于低权限shell获取涉及:ssti漏洞对于提权:pkexec提权。 阅读详情

相关推荐

华为昇腾Atlas200DK. CANN模型推理——目标检测结果不对(无检测结果)的问题解决

目录前言问题描述问题排查1.后处理模块问题排查2.预处理模块问题排查3.模型问题排查4.算法bug问题排查5.AI板卡问题排查6.模型精度问题排查6.模型推理问题解决:模型输入数据与预处理不同后记 前言 上周我在华为昇腾Atlas200DK中部署nanodet和yolov5时,出现了目标检测结果不对(没有检测到任何物体),困扰了整整三天,最后找到原因并圆满解决,在这里记录一下debug过程。 以上测试均在python中完成。 问题描述 第一天上午,我首先将nanodet由pytorch的.pth模型转换为.

qq_41035283的博客 5604

spring Cache的缓存记录

使用Spring Cache需要我们做两方面的事: n声明某些方法使用缓存 n配置Spring对Cache的支持 和Spring对事务管理的支持一样,Spring对Cache的支持也有基于注解和基于XML配置两种方式。下面我们先来看看基于注解的方式。 1基于注解的支持 Spring为我们提供了几个注解来支持Spring Cache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable标记的方法在执行后Spring ...

小屁孩的博客 1193

Python爬虫获取Shopee店铺的所有商品?

通过上述代码示例,我们可以轻松实现获取Shopee店铺所有商品信息的功能。Python爬虫不仅具有强大的功能和稳定性,还可以通过丰富的库支持实现高效的数据抓取和解析。希望这篇文章能为你提供一些启发和帮助。如果你对爬虫开发有更多兴趣,可以尝试探索更复杂的功能,如多线程爬取、数据可视化等。如果你在实践中遇到任何问题,欢迎随时交流和讨论。让我们一起用技术的力量,解锁更多可能!

2401_87195067的博客 1543

spring 缓存 spel表达式

参考https://blog.youkuaiyun.com/yangshangwei/article/details/78157834#spel表达式 在项目中遇到需要根据部分参数来生成缓存key.配置如下: @Cacheable(key="'selectprovincebyprimarykey_' + #provinceid") 注意在双引号中常量string是用单引号括起来的。 1.其它key是使...

pengdayong77的博客 1596

AD9361 RSSI配置实战:从寄存器到精准功率测量的避坑指南

本文详细解析了AD9361芯片的RSSI配置实战,从寄存器设置到精准功率测量的全流程避坑指南。通过优化模式选择、测量持续时间及高级参数配置,实现高精度信号强度测量,并分享实际项目中的校准流程与性能优化技巧,帮助工程师提升射频接收链路的测量精度。

weixin_38166557的博客 442

P4语言实战:如何用Barefoot Tofino实现自定义网络协议(避坑指南)

本文是一份详尽的P4语言实战指南,重点讲解如何利用Barefoot Tofino可编程交换芯片实现自定义网络协议。内容涵盖从P4编程模型解析、自定义协议头定义,到匹配-动作流水线构建、性能优化及生产环境部署的全过程,并特别分享了在资源管理、字节序、调试技巧等方面的宝贵避坑经验,旨在帮助网络开发者和研究人员掌握数据平面编程的核心能力。

echo99的专栏 639

Spring缓存

spring缓存

weixin_45734499的博客 2320

【RViz2】导入urdf模型时报错:Could not load resource xxx,Unable to open file xxx,Error retrieving file xxx

初学ROS2,想要在RViz2中显示urdf模型。其中.urdf文件引用了外部的meshes文件夹。

qq_43557907的博客 9486

spring 基于注解的Cache支持

Spring为我们提供了几个注解来支持Spring Cache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果,而使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素。下面我们将来详细介绍一下Spring基于注解对Cache的支持所提供的几个注解。@Cache

Code-lover's Learning Notes 2428

23、OpenMP常见用例与标准循环级示例详解

本文详细介绍了OpenMP的三种典型用例:循环级OpenMP、高级OpenMP和MPI+OpenMP,适用于不同层次的并行需求。重点讲解了循环级OpenMP在向量加法、流三元组和模板计算中的应用示例,并探讨了首次触摸优化、线程绑定、NUMA架构影响等关键性能优化策略。通过实际代码演示和性能分析,帮助开发者快速掌握OpenMP的基础并行化方法,并为后续高性能优化提供指导。

fanta的博客 85

YOLO11实战优化:长尾分布解决 | 引入Seesaw Loss配合YOLO11分类头,完美应对类别极其不平衡的现实业务场景

摘要: YOLO11在工业缺陷检测等长尾分布场景中面临尾部类别检测失效的问题,根源在于头部类别样本的负样本梯度压制了尾部类别的学习。传统方法如重采样、Focal Loss等效果有限。Seesaw Loss通过动态调整缓解因子和补偿因子,平衡类别间的梯度分布,结合YOLO11的解耦分类头、Anchor-Free设计和C2PSA/C3K2模块,显著提升尾部类别识别能力。文章详细解析了Seesaw Loss的数学原理,并提供了可直接集成到YOLO11的PyTorch实现代码,为长尾分布下的目标检测提供了实用解决方

2601_95807009的博客 252

Springboot—Spring Cache 缓存方案详解及代码-Ehcache

java 缓存详解及代码

深圳市多克创新科技有限公司 7829

uniapp [安卓苹果App端] - 详细实现下载文件保存到用户手机本地,指定文件存储位置路径及文件夹名称下载并保存,Uniapp app端将文件下载保存并储存到指定目录(手机系统存储空间权限检测)

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,app端下载文件,移动端文件下载,并保存到手机本地存储空间,uniapp下载文件保存到手机本地,iOS下载文件怎么保存,系统读写存储空间权限,下载文件到本地详细流程及源代码,保存自定义目录,uniapp,实现下载文件并保存到本地,文件后缀,如何指定手机的存放目录路径url,点击下载文档到手机中并提示存储位置,如何在uniapp中实现文件下载功能,uniApp文件下载,怎么指定文件保存目录,下载报错,没反应

🏆 前端领域优质创作者 1万+

关于Spring中的一级缓存、二级缓存、三级缓存那些事

题记 常常听到别人提起:“一级缓存、二级缓存、三级缓存”。那么它们是什么呢?有什么作用呢?

君战 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring的三级缓存

初始化对象 是否可以没有二级缓存 是否需要三级缓存 主要参考以下几篇文章做了简单的总结:一文告诉你Spring是如何利用"三级缓存"巧妙解决Bean的循环依赖问题的Spring循环依赖三级缓存是否可以去掉第三级缓存spring:我是如何解决循环依赖的?Spring 解决循环依赖为什么使用三级缓存,而不是二级缓存...

m0_67401417的博客 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spring三级缓存详解

Spring三级缓存是为了解决对象间的循环依赖问题。

WorldMvp的专栏 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring三级缓存

轻松拿捏Spring三级缓存 如何解决循环依赖 在正式研究Spring如何解决循环依赖之前,不如我们就假设spring目前没有提供三级缓存来解决循环依赖,那么目前spring的getBean流程图就如下所示:getBean总共就三个大的阶段: 对于Spring而言,循环依赖会发生在第二步,即属性注入的过程,因此我们要想办法在属性注入前将当前Bean依赖的其他bean都进行创建。在属性注入环节,如果发现当前bean依赖于其他be

m0_53157173的博客 3996

Spring 缓存使用

生效原理 抽象而不是实现Spring框架中, 缓存服务是一组抽象, 也就是一组API, 由 org.springframework.cache.Cache org.springframework.cache.CacheManager 抽象. 抽象中并不包含多线程或者多进程处理逻辑, 这些逻辑应该由缓存实现方提供. Spring data工程默认提供了一些实现, 例如ConcurrentHashMap,

congyh的专栏 5489

spring缓存的使用

CacheEvict是用来标注在需要清除缓存元素的方法或类上的。beforeInvocation 清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。默认为false,表示不需要。sync 如果多个请求同时来访问同一个key的数据,则sync表示加锁同步,等第一个请求返回数据后,其他请求直接获取缓存里的数据。每次都会执行目标方法,并将执行结果以键值对的形式存入指定的缓存中。对于Spring,缓存组件例如EhCache是可拔插的,而缓存注解是通用的。

growing1224的博客 1576

Spring的缓存

Spring的缓存

每日丶滴 804

Spring的缓存机制

Spring的缓存机制 Spring的缓存不是一种具体的缓存实现方案,它底层需要依赖EhCache、Guava等具体的缓存工具。应用程序只要面向Spring缓存API编程,应用底层的缓存实现可以在不同的缓存之间自由切换,应用程序无须任何改变,只需要对配置文件略作修改即可。 启用Spring缓存 为了启用Spring缓存,需要在配置文件中导入cache:命名空间。 导入cache:命名空间之后,启用Spring缓存还需要两步: 在Spring配置文件中添加<cache:annotation-d

兴华的博客 1679
上一篇: java8 新特性
下一篇: vim简单操作手册
一只小小翠
博客等级 码龄9年 154粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值