@(Java ThirdParty)[Spring Cache]

Spring Cache Abstraction

简介

  Spring Cache提供了对底层缓存使用的抽象,通过注解的方式使用缓存,减少了对原有的侵入性,通过一个抽象层,分离了不同后端缓存的实现,在不改变代码的前提下,可以切换底层缓存的实现。

  Cache只有应用于幂等性的方法,即同样的输入,返回同样的数据(在数据没有变更时)。

  在多线程的情况下,由Cache底层实现类保存线程安全。

Cache 两次读取数据流程(第一次miss,第二次hit):

注解使用说明

Cacheable

@Cacheable注解用于指示缓存该方法的返回数据。

该注解的属性中,需要指定一个name,用于绑定到低层的缓存(比如,底层使用的是CurrentHashMap,那这个name就是用于指示到底是哪个Map,一般来说,一个方法或者类对应一个Map)

Key Generator

KeyGenerator用于生成Cache Key,默认提供SimpleKeyGenerator计算方法如下:

  1. 如果没有参数,就返回SimpleKey.EMPTY
  2. 如果有一个参数,就返回该参数实例
  3. 如果有多个方法,就返回一个SimpleKey,该实例包含了所有的参数

默认提供的Generator使用hashCode以及equals来计算,所以对于复杂的类,需要实现对应的方法。或者也可以通过自定义KeyGenerator来实现。(使用keyGenerator属性来指定)

除了使用KeyGenerator外,还可以使用key属性来指定(两者只能使用一个,否则会抛异常)

Key属性

通过SpEL来生成Key,如:

@Cacheable(cacheNames="books", key="#isbn")
public Book findBook(ISBN isbn, boolean check); @Cacheable(cacheNames="books", key="#isbn.rawNumber")
public Book findBook(ISBN isbn, boolean check);

Cache Resolution

CacheResolver

Sync

  Cache缓存的时候,如果多次同时调用,当没有命中的时候,会直接调用方法计算,这会导致重复计算,以及缓存没有生效,这时就需要采用同步的方式,一个方法调用,其余的在等待。

  可以通过sync=“true”属性来指定(默认为false)

注:这个特性取决于底层的实现(在Cache Aop读取流程中并没有加锁处理)

条件式缓存

当需要在特定参数情况下才缓存的时候,就可以使用。通过condition来计算,如果为true,则缓存,否则不缓存,如:

@Cacheable(cacheNames="books", condition="#name.length < 32")
public Book findBook(String name);

SpEL Cache表达式上下文

CachePut

@CachePut用于更新缓存

注:不能和@Cacheable同时使用。

CacheEvict

@CacheEvict注解用于淘汰缓存,其中可以通过cacheNames和key属性来淘汰指定的Entry,也可以使用cacheNames和allEntries=true来淘汰掉所有的Entries。

beforeInvocation属性

这个属性用于控制是在方法调用前还是调用后再淘汰缓存,如果是调用后,在抛出异常时,则不会淘汰(默认为false)。

  这里也涉及了缓存写淘汰策略。

Caching

@Caching用于将多个操作组合起来,如CacheEvict和CachePut组合

CacheConfig

类级别的注解,用于定义一些该类的通用配置,可以被方法级别的配置覆盖

三个层级配置:

  1. 全局配置,CacheManager/KeyGenerator
  2. 类级别配置
  3. 方法级别

开启Cache注解功能

@EnableCaching置于@Configuration配置上,或者在XML加入配置:

<cache:annotation-driven />

注:如果把<cache:annotation-driven />放在WebApplicationContext中的话,那就只会扫描controllers,而不是services

Cache存储配置

Spring Cache提供了多个不同的存储集成,使用的时候,只需要定义对应的CacheManager即可。

如下:

  1. JDK ConcurrentMap-based Cache.(使用ConcurrentHashMap作为底层存储)
  2. EhCache-base Cache
  3. Caffeine Cache
  4. Guava Cache
  5. GemFire-base Cache
  6. JSR-107 Cache

Spring Cache可以配置多个Cache实现(使用CompositeCacheManager)

注:如果上述的集成都不满足,则可以自定义实现,通过实现CacheManager和Cache即可。

Cache Aop执行流程

在下述的所有操作中,都没有同步或者锁的操作,即如果要实现相同query防止重复执行,则需要底层缓存库支持。

注:这里会有并发问题,举个例子:查询个人信息。当缓存没有命中的时候,会执行实际的方法,然后将结果缓存起来。在这中间,如果作了更新的操作,并且执行完CacheEvict,然后上述查询结果再缓存起来,就会导致读取到脏数据。所以缓存的时间也需要控制好。

参考资料

  • spring-framework-reference - ch36
  • spring cache 源码

Spring Cache 笔记的更多相关文章

  1. spring 入门笔记(一)

    最近学习spring 通过笔记形式加深自己对spring的理解,也希望能跟各位入门者分享和讨论. 一.下载spring 下载spring也费了不少功夫,目前还没从spring官网找到下载入口,我从下面 ...

  2. struts2,hibernate,spring整合笔记(2)

    上一话struts2,hibernate,spring整合笔记(1) 接下来继续 配置完struts之后就要开始hibernate的配置 hibernate的环境并不依赖web开发环境,在我第一次配置 ...

  3. Spring读书笔记——bean创建(上)

    通过<Spring读书笔记--bean加载>和<Spring读书笔记--bean解析>,我们明白了两件事. Spring如何加载消化一个xml配置文件 Spring如何将xml ...

  4. Spring读书笔记——bean创建(下)

    有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...

  5. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

  6. Spring cache简单使用guava cache

    Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...

  7. 注释驱动的 Spring cache 缓存介绍

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

  8. [转]注释驱动的 Spring cache 缓存介绍

    原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ...

  9. Spring Security笔记:HTTP Basic 认证

    在第一节 Spring Security笔记:Hello World 的基础上,只要把Spring-Security.xml里改一个位置 <http auto-config="true ...

随机推荐

  1. Java数组与函数的结合

    import java.util.Scanner; public class HelloWorld { public static void main(String[] args){ // Scann ...

  2. Linux Debugging(二): 熟悉AT&T汇编语言

    没想到<Linux Debugging:使用反汇编理解C++程序函数调用栈>发表了收到了大家的欢迎.但是有网友留言说不熟悉汇编,因此本书列了汇编的基础语法.这些对于我们平时的调试应该是够用 ...

  3. Dynamics CRM 2013 停用和激活按钮的显示与隐藏

    CRM中命令栏上的有些按钮是可以通过权限控制显示和隐藏的,比如新建.保存.保存并关闭.删除等,但惟独激活和停用无法控制,但我们还是可以用权限去控制,只是稍微绕了那么一下. 这里就要涉及到按钮的自定义了 ...

  4. sql中with的用法(CTE公用表表达式):应用子查询嵌套,提高sql性能

    一.WITH AS的含义 WITH AS短语,也叫子查询部分(subquery factoring),定义一个SQL片断,该片断会被整个SQL语句所用到. 有时是为了让SQL语句的可读性更高些,也可能 ...

  5. Android移动后端服务(BAAS)快速搭建后台服务器之Bmob-android学习之旅(75)

    个人移动开发者的最头疼的问题,就是App的网络后台,包含数据库等,国外目前有比较成熟的解决方案,但是限制于墙的问题,推荐国内的解决方案,比较出名的是Bmob和AVOS cloud和Atom等,这一次我 ...

  6. spring mvc接收List集合、JUI传JSP List

    JUI页面是这样的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <div class=&quo ...

  7. (NO.00001)iOS游戏SpeedBoy Lite成形记(三十):增加排行榜功能3

    在这个例子中,我们的显示代码只需要选手的名字以及对应的成绩.根据选手名字取对应的成绩可以用前面实现的playerRecord:方法,我们只需要将按照成绩排序后的选手名字返回就可以了. 我只需要再实现一 ...

  8. ListView中ConvertView和ViewHolder

    1.概述 ListView是Android中非常常见的控件通过Adapter架起数据与界面显示的桥梁,MVC思想在其中得到了很好地体现: M:model 数据模型    添加到ListView中显示的 ...

  9. [转].NET程序破解仅需三步

    近期开发公司商城,为了简化开发用了V5Shop网店程序.本来预计一个月完工,哪知道出现一堆问题大大增加了我的工作量(早知道还不如全部自己写了). 破V5Shop真不地道,说是免费的,结果程序一大堆问题 ...

  10. SQL 模糊查询(like)

    在进行数据库查询时,有完整查询和模糊查询之分. SQL模糊查询,使用like比较字,加上SQL里的通配符,请参考以下: 1.LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadde ...