Spring缓存注解@Cache使用

摘要:
“accountCache”缓存是在spring*.xml中定义的名称。示例:Java代码@CacheEvict//清空accountCache缓存publicvoidupdateAccount{updateDB;}@CacheEvict//清空accountCache缓存publicvoidreload(){reloadAll()}@Cacheable//缓存名叫accountCachepublicAccountgetAccountByName{//方法内部实现不考虑缓存逻辑,直接实现业务returngetFromDB;}@CachePut注释,这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中,实现缓存与数据库的同步更新。

参考资料

http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/

http://swiftlet.net/archives/774

缓存注解有以下三个:

@Cacheable @CacheEvict @CachePut

@Cacheable(value=”accountCache”), 这个注释的意思是,当调用这个方法的时候,会从一个名叫 accountCache 的缓存中查询,如果没有,则执行实际的方法(即查询数据库),并将执行的结果存入缓存中,否则返回缓存中的对象。这里的缓存中的 key 就是参数 userName,value 就是 Account 对象。“accountCache”缓存是在 spring*.xml 中定义的名称。

示例:

Java代码 收藏代码
  1. @Cacheable(value="accountCache")//使用了一个缓存名叫accountCache
  2. publicAccountgetAccountByName(StringuserName){
  3. //方法内部实现不考虑缓存逻辑,直接实现业务
  4. System.out.println("realqueryaccount."+userName);
  5. returngetFromDB(userName);
  6. }

@CacheEvict 注释来标记要清空缓存的方法,当这个方法被调用后,即会清空缓存。注意其中一个 @CacheEvict(value=”accountCache”,key=”#account.getName()”),其中的 Key 是用来指定缓存的 key 的,这里因为我们保存的时候用的是 account 对象的 name 字段,所以这里还需要从参数 account 对象中获取 name 的值来作为 key,前面的 # 号代表这是一个 SpEL 表达式,此表达式可以遍历方法的参数对象,具体语法可以参考 Spring 的相关文档手册。

示例:

Java代码 收藏代码
  1. @CacheEvict(value="accountCache",key="#account.getName()")//清空accountCache缓存
  2. publicvoidupdateAccount(Accountaccount){
  3. updateDB(account);
  4. }
  5. @CacheEvict(value="accountCache",allEntries=true)//清空accountCache缓存
  6. publicvoidreload(){
  7. reloadAll()
  8. }
  9. @Cacheable(value="accountCache",condition="#userName.length()<=4")//缓存名叫accountCache
  10. publicAccountgetAccountByName(StringuserName){
  11. //方法内部实现不考虑缓存逻辑,直接实现业务
  12. returngetFromDB(userName);
  13. }

@CachePut 注释,这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中,实现缓存与数据库的同步更新。

示例:

Java代码 收藏代码
  1. @CachePut(value="accountCache",key="#account.getName()")//更新accountCache缓存
  2. publicAccountupdateAccount(Accountaccount){
  3. returnupdateDB(account);
  4. }

@Cacheable、@CachePut、@CacheEvict 注释介绍

通过上面的例子,我们可以看到 spring cache 主要使用两个注释标签,即 @Cacheable、@CachePut 和 @CacheEvict,我们总结一下其作用和配置方法。

表 1. @Cacheable 作用和配置方法

@Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存

@Cacheable 主要的参数
value缓存的名称,在 spring 配置文件中定义,必须指定至少一个例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
表 2. @CachePut 作用和配置方法

@CachePut 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用

@CachePut 主要的参数
value缓存的名称,在 spring 配置文件中定义,必须指定至少一个例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
表 3. @CacheEvict 作用和配置方法

@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空

@CacheEvict 主要的参数
value缓存的名称,在 spring 配置文件中定义,必须指定至少一个例如:
@CachEvict(value=”mycache”) 或者
@CachEvict(value={”cache1”,”cache2”}
key缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合例如:
@CachEvict(value=”testcache”,key=”#userName”)
condition缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才清空缓存例如:
@CachEvict(value=”testcache”,
condition=”#userName.length()>2”)
allEntries是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存例如:
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存例如:
@CachEvict(value=”testcache”,beforeInvocation=true)

免责声明:文章转载自《Spring缓存注解@Cache使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#取色器Mysql—用存储过程和事件每月定时创建一张数据库表下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

重建win7桌面图标缓存

在整理了桌面图标后,经常出现一些快捷方式的图标无法显示的问题。这就需要重建桌面图标缓存。 1、进入C:\Users\Admin\AppData\Local找到IconCache.db并删除 2、删除explorer.exe进程,重建explorer.exe进程...

如何分析网站响应慢

还在为网站响应慢但是无从下手而苦恼吗?迟来的元旦福利来了,读完这篇文章,不管多慢的网站,都给他优化的像你一样快。(承认我夸张了,但是你快是显然的。--) 想要排查网站为什么这么慢,就先要先简单了解下从发起请求到渲染页面经理了哪些过程。 1、请求 URL。 2、查询本地缓存,无缓存则请求 DNS,获取服务器地址。 3、tcp 连接,发送 http 请求。 4...

CPU高速缓存行与内存关系 及并发MESI 协议

先来一个整体图 一. 大致关系: CPU Cache --> 前端总线 FSB (下图中的Bus) --> Memory 内存 CPU 为了更快的执行代码。于是当从内存中读取数据时,并不是只读自己想要的部分。而是读取足够的字节来填入高速缓存行。根据不同的 CPU ,高速缓存行大小不同。如 X86 是 32BYTES ,而 ALPHA 是 64...

nginx高并发优化

一、一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。 2.  worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 0...

Asp.Net 4.0 新特性之 使用自定义OutputCache Provider

Asp.Net 4.0 新特性之 使用自定义OutputCache Provider 在Asp.Net 4.0 的web.config文件中添加了关于缓存的配置节,如下所示: <system.web> <compilation debug="true" targetFramework="4.0" /> <...

vue页面是否缓存的两种方式

第一种 <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"></router-view&g...