热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析Spring3.1缓存机制与应用技巧

下面简单介绍一下spring3.1.M1中的cache功能。spring3.1.M1中负责cache的模块是org.springframework.context-3.1.0.M

下面简单介绍一下spring3.1.M1中的cache功能。

spring3.1.M1中负责cache的模块是org.springframework.context-3.1.0.M1.jar

与2.5时的modules模块类似,3.1的注解缓存也是在方法上声明注解,3.1同样提供了两个注解:

@Cacheable:负责将方法的返回值加入到缓存中

@CacheEvict:负责清除缓存

@Cacheable 支持如下几个参数:

value:缓存位置名称,不能为空,如果使用EHCache,就是ehcache.xml中声明的cache的name

key:缓存的key,默认为空,既表示使用方法的参数类型及参数值作为key,支持SpEL

condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL

例如:

//将缓存保存进andCache,并使用参数中的userId加上一个字符串(这里使用方法名称)作为缓存的key
@Cacheable(value="andCache",key="#userId + 'findById'")
public SystemUser findById(String userId) {
SystemUser user = (SystemUser) dao.findById(SystemUser.class, userId);
return user ;
}
//将缓存保存进andCache,并当参数userId的长度小于32时才保存进缓存,默认使用参数值及类型作为缓存的key
&#64;Cacheable(value&#61;"andCache",condition&#61;"#userId.length <32")
public boolean isReserved(String userId) {
System.out.println("hello andCache"&#43;userId);
return false;
}

&#64;CacheEvict 支持如下几个参数&#xff1a;

value&#xff1a;缓存位置名称&#xff0c;不能为空&#xff0c;同上

key&#xff1a;缓存的key&#xff0c;默认为空&#xff0c;同上

condition&#xff1a;触发条件&#xff0c;只有满足条件的情况才会清除缓存&#xff0c;默认为空&#xff0c;支持SpEL

allEntries&#xff1a;true表示清除value中的全部缓存&#xff0c;默认为false

例如&#xff1a;

//清除掉指定key的缓存
&#64;CacheEvict(value&#61;"andCache",key&#61;"#user.userId &#43; &#39;findById&#39;")
public void modifyUserRole(SystemUser user) {
System.out.println("hello andCache delete"&#43;user.getUserId());
}

 //清除掉全部缓存
&#64;CacheEvict(value&#61;"andCache",allEntries&#61;true)
public final void setReservedUsers(String[] reservedUsers) {
System.out.println("hello andCache deleteall");
}

一般来说&#xff0c;我们的更新操作只需要刷新缓存中某一个值&#xff0c;所以定义缓存的key值的方式就很重要&#xff0c;最好是能够唯一&#xff0c;因为这样可以准确的清除掉特定的缓存&#xff0c;而不会影响到其它缓存值 &#xff0c;

比如我这里针对用户的操作&#xff0c;使用(userId&#43;方法名称)的方式设定key值 &#xff0c;当然&#xff0c;你也可以找到更适合自己的方式去设定。

了解了cache的注解之后&#xff0c;接下来说说如何使注解生效&#xff0c;其实就是需要在spring的配置文件中增加一些配置。

1.spring-cache

首先我们来看一下如何使用spring3.1自己的cache&#xff0c;

需要在命名空间中增加cache的配置

Xml代码

  1. xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"xmlns:p&#61;"http://www.springframework.org/schema/p"
  2. xmlns:cache&#61;"http://www.springframework.org/schema/cache"
  3. xsi:schemaLocation&#61;"
  4. http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  5. http://www.springframework.org/schema/cachehttp://www.springframework.org/schema/cache/spring-cache-3.1.xsd">

之后添加如下声明&#xff1a;

Xml代码

  1. class&#61;"org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"
  2. p:name&#61;"default"/>
  3. class&#61;"org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"
  4. p:name&#61;"andCache"/>

2.spring-ehcache

接下来说说对ehcache的支持&#xff0c;其实只需要把cacheManager换成EHCache的cacheManager即可&#xff0c;如下&#xff1a;

Java代码

  1. p:configLocation&#61;"classpath:/config/ehcache.xml"/>
  2. p:cacheManager-ref&#61;"cacheManagerFactory"/>

ehcache.xml

Xml代码
  1. xsi:noNamespaceSchemaLocation&#61;"ehcache.xsd"updateCheck&#61;"true"
  2. monitoring&#61;"autodetect">
  3. timeToIdleSeconds&#61;"120"timeToLiveSeconds&#61;"120"overflowToDisk&#61;"true"
  4. maxElementsOnDisk&#61;"10000000"diskPersistent&#61;"false"
  5. diskExpiryThreadIntervalSeconds&#61;"120"memoryStoreEvictionPolicy&#61;"LRU"/>
  6. maxElementsOnDisk&#61;"1000"eternal&#61;"false"overflowToDisk&#61;"true"
  7. diskSpoolBufferSizeMB&#61;"20"timeToIdleSeconds&#61;"300"timeToLiveSeconds&#61;"600"
  8. memoryStoreEvictionPolicy&#61;"LFU"/>

ok&#xff0c;这样注解缓存就生效了。


推荐阅读
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
author-avatar
skyyyf
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有