热门标签 | 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编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入浅出:Google工程师的算法学习指南
    通过Google工程师的专业视角,带你系统掌握算法的核心概念与实践技巧。 ... [详细]
  • 本文深入探讨了 Python 列表切片的基本概念和实际应用,通过具体示例展示了不同切片方式的使用方法及其背后的逻辑。 ... [详细]
author-avatar
纸灰机forever
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有