注释驱动的Spring cache缓存介绍

概述

Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案 (例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即 能够达到缓存方法的返回对象的效果。

Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存临时存储方案,也支持和主流的专业 缓存例如 EHCache 集成。

其特点总结如下:

通过少量的配置 annotation 注释即可使得既有代码支持缓存

支持开箱即用 Out-Of-The-Box,即不用安装和部署额外第三方组件即可使用缓存

支持 Spring Express Language,能使用对象的任何属性或者方法来定义缓存的 key 和 condition

支持 AspectJ,并通过其实现任何方法的缓存支持

支持自定义 key 和自定义缓存管理者,具有相当的灵活性和扩展性

本文将针对上述特点对 Spring cache 进行详细的介绍,主要通过一个简单的例子和原理介绍展开,然后我们将一起看 一个比较实际的缓存例子,最后会介绍 spring cache 的使用限制和注意事项。OK,Let ’ s begin!

原来我们是怎 么做的

这里先展示一个完全自定义的缓存实现,即不用任何第三方的组件来实现某种对象的内存缓存。

场景是:对一个 账号查询方法做缓存,以账号名称为 key,账号对象为 value,当以相同的账号名称查询账号的时候,直接从缓存中返回结 果,否则更新缓存。账号查询服务还支持 reload 缓存(即清空缓存)。

首先定义一个实体类:账号类,具备基本 的 id 和 name 属性,且具备 getter 和 setter 方法

清单 1. Account.java

package cacheOfAnno; 

public class Account {
  private int id;
  private String name; 

  public Account(String name) {
    this.name = name;
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

然后定义一个缓存管理器,这个管理器负责实现缓存逻辑,支持对象的增加、修改和删除,支持值对象的泛型。 如下:

清单 2. MyCacheManager.java

package oldcache; 

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; 

public class MyCacheManager<T> {
  private Map<String,T> cache =
      new ConcurrentHashMap<String,T>(); 

  public T getValue(Object key) {
    return cache.get(key);
  } 

  public void addOrUpdateCache(String key,T value) {
    cache.put(key, value);
  } 

  public void evictCache(String key) {// 根据 key 来删除缓存中的一条记录
    if(cache.containsKey(key)) {
      cache.remove(key);
    }
  } 

  public void evictCache() {// 清空缓存中的所有记录
    cache.clear();
  }
}

好,现在我们有了实体类和一个缓存管理器,还需要一个提供账号查询的服务类,此服务类使用缓存管理器来支 持账号查询缓存,如下:

清单 3. MyAccountService.java

package oldcache; 

import cacheOfAnno.Account; 

public class MyAccountService {
  private MyCacheManager<Account> cacheManager; 

  public MyAccountService() {
    cacheManager = new MyCacheManager<Account>();// 构造一个缓存管理器
  } 

  public Account getAccountByName(String acctName) {
    Account result = cacheManager.getValue(acctName);// 首先查询缓存
    if(result!=null) {
      System.out.println("get from cache..."+acctName);
      return result;// 如果在缓存中,则直接返回缓存的结果
    }
    result = getFromDB(acctName);// 否则到数据库中查询
    if(result!=null) {// 将数据库查询的结果更新到缓存中
      cacheManager.addOrUpdateCache(acctName, result);
    }
    return result;
  } 

  public void reload() {
    cacheManager.evictCache();
  } 

  private Account getFromDB(String acctName) {
    System.out.println("real querying db..."+acctName);
    return new Account(acctName);
  }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索缓存
, spring缓存
, cache
, ehcache
, spring 表单查询
, 账号
, public
, concurrenthashmap
, 支持
, spring @cacheable ehcache
, 一个
, 缓存器
, 缓存key
缓存驱动
spring mvc cache缓存、spring cache缓存过期、spring cache二级缓存、spring cache、spring cacheable,以便于您获取更多的相关知识。

时间: 2024-12-30 20:10:31

注释驱动的Spring cache缓存介绍的相关文章

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

原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果. Spring 的缓存技术还具备相当的灵活性,不仅能

Spring Cache 介绍

Spring Cache 缓存是实际工作中非常常用的一种提高性能的方法, 我们会在许多场景下来使用缓存. 本文通过一个简单的例子进行展开,通过对比我们原来的自定义缓存和 spring 的基于注释的 cache 配置方法,展现了 spring cache 的强大之处,然后介绍了其基本的原理,扩展点和使用场景的限制.通过阅读本文,你应该可以短时间内掌握 spring 带来的强大缓存技术,在很少的配置下即可给既有代码提供缓存能力. 概述 Spring 3.1 引入了激动人心的基于注释(annotati

spring 3.1激动人心的新特性:注释驱动的缓存

通过阅读本文,你可以短时间内掌握 spring 带来的强大缓存技术,在很少的配置下即可给既有代码提供缓存能力. Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果. Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpEL(Spring Ex

java中利用spring cache解耦业务中的缓存

虽然以前实现缓存的方式,是定义了缓存操作接口,可以灵活实现不同的缓存,可毕竟精力有限,要完成不同的缓存实现也是件麻烦的事.更要命的是,业务代码中有大量缓存操作的代码,耦合度太高,看着很不优雅. 所以呢,抽空了解了一下其它实现方案.这不,spring3.1开始,支持基于注解的缓存,算是目前我比较可以接受的一种方案吧.学完之后还是做一下笔记吧. spring cache是一套基于注解实现的缓存技术,其本身是并不是具体实现,不过默认实现了ConcurrentMap和EHCache实现的缓存.当然也是支

ehcache +mybatis+spring 自定义缓存策略

从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调用该方法时将不再执行该方法,而是直接从缓存中获取结果进行返回.所以在使用Spring Cache的时候我们要保证我们缓存的方法对于相同的方法参数要有相同的返回结果.        使用Spring Cache需要我们做两方面的事

Spring Cache抽象详解

缓存简介 缓存,我的理解是:让数据更接近于使用者:工作机制是:先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存):缓存什么:那些经常读取且不经常修改的数据/那些昂贵(CPU/IO)的且对于相同的请求有相同的计算结果的数据.如CPU--L1/L2--内存--磁盘就是一个典型的例子,CPU需要数据时先从L1/L2中读取,如果没有到内存中找,如果还没有会到磁盘上找.还有如用过Maven的朋友都应该知道,我们找依赖的时候,先从本机仓库找,再从本地服务器仓库找,最后到远程仓库服务器

ASP.NET缓存介绍

ASP.NET缓存 介绍 缓存是在内存存储数据的一项技术,也是ASP.NET中提供的重要特性之一.例如你可以在复杂查询的时候缓存数据,这样后来的请求就不需要从数据库中取数据,而是直接从缓存中获取.通过使用缓存可以提高应用程序的性能. 主要有两种类型的缓存: 输出缓存Output caching 数据缓存Data caching 1. 输出缓存(Output Caching) 使用输出缓存,你可以缓存最后输出的HTML页面,当相同的页面再次请求的时候,ASP.NET不会再执行页面的生命周期和相关代

MyBatis学习教程(七)-Mybatis缓存介绍_java

一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 1.一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空. 2. 二级缓存: 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自

wordpress中Hyper Cache缓存插件安装和使用方法

本文就来介绍wordpress提速插件中比较小巧但又很管用的缓存插件--Hyper Cache .那么,wordpress缓存插件Hyper Cache如何安装和使用?下面,我们就一起来看看吧. 第一步.安装Hyper Cache 缓存插件. 进入wp的管理后台,点击"插件">>"安装插件" ,再搜索Hyper Cache ,第一个就是了,安装我就不说了. 第二步.启动Hyper Cache 缓存插件. 安装完成以后,点击启用插件.然后,点击"