热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

spring缓存代码详解

这篇文章主要介绍了spring缓存代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

本文研究的主要是spring缓存的相关内容,具体介绍如下。

这篇文章是根据谷歌翻译大致修改出来的,由于原文不知道是什么语,所以可能导致翻译的有错误和不准确的地方,但是大致的方向感觉还是蛮不错的,所以在这里整理了一下,希望能够有所帮助。

高速缓存一直是一个非常需要这两个提高应用程序性能并降低其工作量。此外,它的用处今天是特别明显,可以作出处理成千上万的游客concurrents.D'un架构上的Web应用,高速缓存管理正交于应用程序的业务逻辑和出于这个原因,应该对应用程序本身的发展产生的影响最小。从3.1版本开始,Spring提供了高速缓存管理的API,类似声明式事务管理。缓存的抽象接口,统一使用不同的缓存解决方案,对代码的影响最小。

spring用Java方法,对带有参数的组合第一次请求到一个方法,spring将返回值存储在高速缓存中。因此,下一个请求将是直接使用从高速缓存的值,而不必调用可能的高代价的方法。一切都透明地施加,而不会影响调用的方法。
在这篇文章中,我们将看到与Spring的两个不同的缓存存储的实现。

  • Java的ConcurrentHashMap
  • Ehcache

实现

spring和缓存的整合是简单透明的,通过@Cacheable注解标注需要缓存的方法

@Cacheable(value= "dataCache")  
public Reponse getDatas(Long param1, String param2){ } 

dataCache是相关联的高速缓存的名称。第一次调用这个方法的时候,该方法执行并将执行的结果存入以<参数1,参数2>哈希出来的秘钥为结果的结果集中去,当使用同样的参数再次调用的时候,这个方法不需要再次的执行。

有可能多于一个的缓存关联到我们的方法

@Cacheable({"dataCache",”default”})   
public Reponse getDatas(Long param1, String param2){  } 

在这种情况下,每个缓存都会在方法执行之前检查,如果有命中的话,则相关的值会被返回。

生成缓存键

一个缓存管理器的基本算法的占比比较小。缓存可以看做是一个存储器区域,在其中存储的对象个由唯一的秘钥进行映射。对象搜索的过程如下:

1、计算key(利用hash方法得到hashcode)
2、根据key值查找对象
3、如果找到对象返回该结果
4、如果找不到,则会计算实际与对象相关连的key,并把对象存入相应的位置

spring使用的是简单的哈希,它根据传递的方法参数生成key

自定义缓存

目标方法不能简单的根据参数产生不用的key,根据参数生成的仅仅是一些简单的情况

@Cacheable(value= "dataCache")   
public Reponse getDatas(Long param1, String param2, boolean param3){  } 

@Cacheable是允许开发人员自己指定key生成的方式的,可以使用spel表达式来做这件事情

@Cacheable(value= "dataCache", key="#param2")   
public Reponse getDatas(Long param1, String param2, boolean param3){   } 

上边的这种情况,缓存计算的秘钥的参数就仅仅是Parma2

spring也允许使用嵌套的属性

@Cacheable(value="dataCache", key=#param2.name")  
 public Reponse getDatas(Long param1, Data param2, boolean param3){} 

这种情况就是根据Parma2的name属性计算的秘钥

条件缓存

有一个缓存可能不适用于所用情况下的缓存,但是在某一些情况下需要缓存,缓存的时候根据SPEL表达式计算的真假来进行缓存的处理,如果条件为真的情况下则进行缓存

@Cacheable(value= "dataCache", key="#param2", cOndition="#param2.length<64")   
public Reponse getDatas(Long param1, String param2, boolean param3){  } 

在这种情况下是仅仅当第二个参数的长度小于64的时候才会进行缓存

@CacheEvict注解

spring的缓存不仅仅可以将数据进行缓存还可以清除缓存一个缓存存储。该过程用于去除过时的数据或不用的缓存数据。注解@ CacheEvict定义了执行缓存清空的方法,这些是删除缓存中数据的触发器。

@CacheEvict(value= "dataCache")   
public void reloadData(){  } 

这个选项是非常有必要的,当一个缓存的数据的需要清空的时候就会用到这个方法。

启用缓存

要启用一个spring项目对缓存的支持,我们需要再命名空间上增加对缓存注释的语句

   
  
 

删除注解可以禁用缓存,也可在我们的配置类中启用对缓存的使用

@Configuration   
@EnableCaching   
public class AppConfig {  } 

技术限制

对象传递方法的参数必须有自己的hashcode方法,以便用来计算秘钥

作为参数传递和返回的对象,它应该是可以序列化的

实现选择

spring提供了两种基本的实现:

  1. java的concurrentHashMap
  2. Ehcache

使用它们的时候,只需要声明适当的CacheManger和管理器的实体

使用java的ConcurrentHashMap

   
     
       
         
         
       
     
 

每个Manger都需要一个名称,通过注释来识别它。人们可以由一个Manger管理多个SimpleCacheManger,这个实现很基本不需要而外的库。

实现Ehcache

声明CacheManger

bean id="cacheManager"    
class="org.springframework.cache.ehcache.EhCacheCacheManager">   
    
   
  
 
   
    
 

在ehcache.xml中文件是应用程序缓存参数文件:

  
  
     
    
  
   
   

使用ehcache的,我们可以在一个非常简单的方式定义多个高速缓存不同的参数

名称:高速缓存的标识符

maxBytesLocalHeap:定义高速缓存可以使用虚拟机的字节数。如果一个的CacheManager maxBytesLocalHeap已经设置,则高速缓存的所确定的尺寸将被减去的CacheManager。其他缓存共享的休息。此属性的值是数据<编号> K | K | M | M | G | G代表千字节(K | K),兆字节(M | M)或千兆字节(G | G)。

永恒:定义元素是否是永恒的。如果是这样的情况下,超时将被忽略,该项目是永不过期。
timeToIdleSeconds:这是秒数,该项目自从他上次utilisation.La默认值为0住,元素保持静止
timeToLiveSeconds:这是秒数该项目已住自cache.La默认价值创造为0,该项目将永远活着。
memoryStoreEvictionPolicy掠夺政策:LRU - 最近最少使用,不经常使用的FIFO -先入先出,按创建日期最古老的元素。
diskExpiryThreadIntervalSeconds:的止赎过程控制两个运行之间的秒数。
diskPersistent:允许存储在磁盘上的虚拟机的两场比赛间的对象恢复对象。
overflowToDisk:确定对象是否可以被存储在磁盘上的情况下达到最大的存储元件的

总结用一个简单的数学公式:expiratiOnTime= Math.min((creationTime + timeToLive),(mostRecentTime + timeToIdle))

总结

以上就是本文关于spring缓存代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
author-avatar
纸灰机forever
这个家伙很懒,什么也没留下!
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有