简介

Spring3.1开始引入了基于注释的缓存,其使用方法和原理类似于Spring对事务管理的支持。可以对容器中的任意的bean或bean的方法添加缓存。

 

配置Spring缓存

Spring缓存主要有三个配置 
1.在Spring配置文件导入context:命名空间 
2.配置缓存管理器,不同的缓存使用不同的配置,如果是EhCache,需要先配置一个ehcache.xml 
3.在spring配置文件中启用缓存,如下:

  1. <cache:annotation-driven cache-manager="缓存管理器ID" />

ehcache.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
  4. updateCheck="false" monitoring="autodetect"
  5. dynamicConfig="true">
  6. <diskStore path="java.io.tmpdir"/>
  7. <!-- 默认缓存区 -->
  8. <defaultCache
  9. maxElementsInMemory="1000"
  10. eternal="false"
  11. timeToIdleSeconds="120"
  12. timeToLiveSeconds="120"
  13. overflowToDisk="true"/>
  14. <!-- 名为quoteCarrier的缓存区 -->
  15. <cache name="users"
  16. maxElementsInMemory="100"
  17. eternal="true"
  18. overflowToDisk="true"/>
  19. </ehcache>

参数说明:

参数 说明
<diskStore/> 当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口)。
<diskStore path=""/> 用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是.data和.index。
name 缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里)。
maxElementsOnDisk 磁盘缓存中最多可以存放的元素数量,0表示无穷大。
maxElementsInMemory 内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况:(1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中。(2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素。
Eternal 缓存中对象是否永久有效,即是否永驻内存,true时将忽略timeToIdleSeconds和timeToLiveSeconds。
timeToIdleSeconds 缓存数据在失效前的允许闲置时间(单位:秒),即访问这个cache中元素的最大间隔时间,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除。默认值是0表示可闲置时间无穷大。仅当eternal=false时使用
timeToLiveSeconds 缓存数据在失效前的允许存活时间(单位:秒),即Cache中的某元素从创建到清除的生存时间,也就是说从创建开始计时,当超过这个时间时,此元素将从Cache中清除。默认值是0表示可闲置时间无穷大。仅当eternal=false时使用
overflowToDisk 内存不足时,是否启用磁盘缓存(即内存中对象数量达到maxElementsInMemory时,Ehcache会将对象写到磁盘中)
diskPersistent 是否持久化磁盘缓存。当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件,这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存,要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法。
diskExpiryThreadIntervalSeconds 磁盘缓存的清理线程运行间隔,默认是120秒。
diskSpoolBufferSizeMB 设置DiskStore(磁盘缓存)的缓存区大小,默认是30MB
memoryStoreEvictionPolicy 内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存,共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出)。

配置缓存管理器 
看一个完整的Spring配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:cache="http://www.springframework.org/schema/cache"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  9. http://www.springframework.org/schema/cache
  10. http://www.springframework.org/schema/cache/spring-cache-4.0.xsd
  11. http://www.springframework.org/schema/context
  12. http://www.springframework.org/schema/context/spring-context-4.0.xsd">
  13.  
  14. <context:component-scan base-package="com.service"/>
  15.  
  16. <!-- 启用缓存 -->
  17. <cache:annotation-driven cache-manager="cacheManager" />
  18.  
  19. <!-- 配置EhCache的CacheManager,通过configLocation指定ehcache.xml文件的位置 -->
  20. <bean id="ehCacheManager"
  21. class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
  22. p:configLocation="classpath:ehcache.xml"
  23. p:shared="false" />
  24.  
  25. <!-- 配置基于EhCache的缓存管理器,并将EhCache的CacheManager注入该缓存管理器Bean -->
  26. <bean id="cacheManager"
  27. class="org.springframework.cache.ehcache.EhCacheCacheManager"
  28. p:cacheManager-ref="ehCacheManager" >
  29. </bean>
  30.  
  31. </beans>

这样就可以在java文件里启用缓存注解了。

  1. @Service("userService")
  2. @Cacheable(value="users")
  3. public class UserServiceImpl implements UserService {
  4.  
  5. @Override
  6. public User getUsersByNameAndAge(String name, int age) {
  7. System.out.println("正在执行getUsersByNameAndAge()..");
  8. return new User(name,age);
  9. }
  10.  
  11. }

当然,注解也可以加在某个方法上,如:

  1. @Service("userService")
  2. public class UserServiceImpl implements UserService {
  3.  
  4. @Override
  5. @Cacheable(value = "users", key = "#name", sync = true)
  6. public User getUsersByNameAndAge(String name, int age) {
  7. System.out.println("正在执行getUsersByNameAndAge()..");
  8. return new User(name,age);
  9. }
  10.  
  11. }

基于类或某个方法的缓存,缓存之后,程序调用该类或该方法,只要传入的参数相同,Spring并不会真正进入该类或方法,而是直接根据传入的参数去缓存中查找数据。

Spring基于注解的缓存

1.@Cacheable 
该注解主要针对方法注释,能够根据方法的请求参数对其结果进行缓存。 
主要参数有:

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

2.@CachePut 
主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和@Cacheable不同的是,它每次都会触发真实方法的调用。也就是说,用@CachePut标注的方法在执行前都不会去检查缓存中是否存在之前执行过的结果,而是在每次执行时都会调用该方法,将该方法的结果以键值对的形式存入指定的缓存中。 
那么既然每次cachePut都要触发真实的方法调用,那么它的作用是什么呢? 
看一段代码:

  1. @Cacheable(value="userCache",key="1000")
  2. public String getUserByName(String userName) {
  3. System.out.println("两次调用第一次会执行,第二次不会执行!");
  4. return getFromDB(userName);
  5. }
  6.  
  7. @CachePut(value="userCache",key="1000")
  8. public String updateUserPut(String userName) {
  9. return updateDB(userName);
  10. }

在进行数据库相关的操作时,如果是要更新数据,那么使用@CachePut可以确保每次更新的数据都写进了缓存里,那么下次再获取相同的数据的时候,就能拿到更新后的数据。这里只要保证:
(1)必须是同一个缓存实例
(2)必须是相同的key
@CachePut的参数跟@Cacheable是一样的,参考@Cacheable的参数即可。

3.@CachEvict 
主要针对方法配置,能够根据一定的条件对缓存进行清空。 
除了value, key, condition这三个基本参数之外,还有其他参数:

参数 说明
allEntries 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存
beforeInvocation 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存

spring 缓存机制的更多相关文章

  1. Spring(五)Spring缓存机制与Redis的结合

    一.Redis和数据库的结合 使用Redis可以优化性能,但是存在Redis的数据和数据库同步的问题. 例如,T1时刻以将 key1 保存数据到 Redis,T2时刻刷新进入数据库,但是T3时刻发生了 ...

  2. Spring缓存机制的理解

    在spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: package com.sin90lzc ...

  3. Spring缓存机制(转)

    Spring的缓存机制非常灵活,可以对容器中任意Bean或者Bean的方法进行缓存,因此这种缓存机制可以在JavaEE应用的任何层次上进行缓存. Spring缓存底层也是需要借助其他缓存工具来实现,例 ...

  4. 8 -- 深入使用Spring -- 5... Spring 3.1 新增的缓存机制

    8.5 Spring 3.1 新增的缓存机制 Spring 3.1 新增了一种全新的缓存机制,这种缓存机制与Spring容器无缝地整合在一起,可以对容器中的任意Bean或Bean的方法增加缓存.Spr ...

  5. 【spring-boot】spring-boot整合ehcache实现缓存机制

    EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心 ...

  6. spring-boot整合ehcache实现缓存机制

    EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心 ...

  7. 以Spring整合EhCache为例从根本上了解Spring缓存这件事(转)

    前两节"Spring缓存抽象"和"基于注解驱动的缓存"是为了更加清晰的了解Spring缓存机制,整合任何一个缓存实现或者叫缓存供应商都应该了解并清楚前两节,如果 ...

  8. Spring控制Hibernate的缓存机制ehcache

    首先在spring.xml中进入bean <prop key="hibernate.cache.use_second_level_cache">true</pro ...

  9. (37)Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] 写后感:博主写这么一系列文章也不容易啊,请评论支持下. 如果看过我之前(35)的文章这一篇的文章就会很简单,没有什么挑战性了. 那么我们先说说这一篇文 ...

随机推荐

  1. 消息中间件--"rocketmq"02之QuickStart

    依赖 <dependency> <groupId>com.alibaba.rocketmq</groupId> <artifactId>rocketmq ...

  2. Mysql 用户权限管理--从 xxx command denied to user xxx

    今天遇到一个mysql 权限的问题,即标题所述  xxx command denied to user xxx,一般mysql 这种报错,基本都属于当前用户没有进行该操作的权限,需要 root 用户授 ...

  3. Java之关于JSTL引入问题

    错误信息:Can not find the tag library descriptor for “http://java.sun.com/jstl/core”JSTL taglib需要jstl.ja ...

  4. Spring(十一)之AOP

    Spring 框架的一个关键组件是面向方面的编程(AOP)框架.面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点.跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于 ...

  5. RedHat(小红帽)下 yum用不了的解决办法

    由于RedHat是商业版的,通常由于没有注册,导致yum程序无法使用(linux下面,yum是个安装软件的“神器”).此时可用CentOS的地址进行替换.下面将一步步说明如何处理: 一.删除RedHa ...

  6. 安卓 通过www读取Application.persistentDataPath

    今天在读取Application.persistentDataPath路径下的图片时,在前面加上“file:///” 例如 #if UNITY_EDITOR || UNITY_STANDALONE r ...

  7. 如何使用jquery.qrcode.js插件生成二维码

    1.首先需要准备 jquery.qrcode.js 和 jquery.js github地址:https://github.com/lrsjng/jquery-qrcode 官方文档地址:http:/ ...

  8. HTML5与CSS3网页设计

    <!--一个网页的基本结构写法--> <!doctype html> <html> <head>//头部 <title>标题</tit ...

  9. SFTP 服务搭建

    1. 介绍 sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一样的语法和功能.SFTP ...

  10. Oracle 表空间、段、区和块简述

    数据块(Block) 数据块Block是Oracle存储数据信息的最小单位.注意,这里说的是Oracle环境下的最小单位.Oracle也就是通过数据块来屏蔽不同操作系统存储结构的差异.无论是Windo ...