spring 缓存机制
简介
Spring3.1开始引入了基于注释的缓存,其使用方法和原理类似于Spring对事务管理的支持。可以对容器中的任意的bean或bean的方法添加缓存。
配置Spring缓存
Spring缓存主要有三个配置
1.在Spring配置文件导入context:命名空间
2.配置缓存管理器,不同的缓存使用不同的配置,如果是EhCache,需要先配置一个ehcache.xml
3.在spring配置文件中启用缓存,如下:
<cache:annotation-driven cache-manager="缓存管理器ID" />
ehcache.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false" monitoring="autodetect"
dynamicConfig="true">
<diskStore path="java.io.tmpdir"/>
<!-- 默认缓存区 -->
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"/>
<!-- 名为quoteCarrier的缓存区 -->
<cache name="users"
maxElementsInMemory="100"
eternal="true"
overflowToDisk="true"/>
</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配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <context:component-scan base-package="com.service"/> <!-- 启用缓存 -->
<cache:annotation-driven cache-manager="cacheManager" /> <!-- 配置EhCache的CacheManager,通过configLocation指定ehcache.xml文件的位置 -->
<bean id="ehCacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
p:configLocation="classpath:ehcache.xml"
p:shared="false" /> <!-- 配置基于EhCache的缓存管理器,并将EhCache的CacheManager注入该缓存管理器Bean -->
<bean id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheCacheManager"
p:cacheManager-ref="ehCacheManager" >
</bean> </beans>
这样就可以在java文件里启用缓存注解了。
@Service("userService")
@Cacheable(value="users")
public class UserServiceImpl implements UserService {
@Override
public User getUsersByNameAndAge(String name, int age) {
System.out.println("正在执行getUsersByNameAndAge()..");
return new User(name,age);
}
}
当然,注解也可以加在某个方法上,如:
@Service("userService")
public class UserServiceImpl implements UserService {
@Override
@Cacheable(value = "users", key = "#name", sync = true)
public User getUsersByNameAndAge(String name, int age) {
System.out.println("正在执行getUsersByNameAndAge()..");
return new User(name,age);
}
}
基于类或某个方法的缓存,缓存之后,程序调用该类或该方法,只要传入的参数相同,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都要触发真实的方法调用,那么它的作用是什么呢?
看一段代码:
@Cacheable(value="userCache",key="1000")
public String getUserByName(String userName) {
System.out.println("两次调用第一次会执行,第二次不会执行!");
return getFromDB(userName);
} @CachePut(value="userCache",key="1000")
public String updateUserPut(String userName) {
return updateDB(userName);
}
在进行数据库相关的操作时,如果是要更新数据,那么使用@CachePut可以确保每次更新的数据都写进了缓存里,那么下次再获取相同的数据的时候,就能拿到更新后的数据。这里只要保证:
(1)必须是同一个缓存实例
(2)必须是相同的key
@CachePut的参数跟@Cacheable是一样的,参考@Cacheable的参数即可。
3.@CachEvict
主要针对方法配置,能够根据一定的条件对缓存进行清空。
除了value, key, condition这三个基本参数之外,还有其他参数:
| 参数 | 说明 |
|---|---|
| allEntries | 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 |
| beforeInvocation | 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 |
spring 缓存机制的更多相关文章
- Spring(五)Spring缓存机制与Redis的结合
一.Redis和数据库的结合 使用Redis可以优化性能,但是存在Redis的数据和数据库同步的问题. 例如,T1时刻以将 key1 保存数据到 Redis,T2时刻刷新进入数据库,但是T3时刻发生了 ...
- Spring缓存机制的理解
在spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: package com.sin90lzc ...
- Spring缓存机制(转)
Spring的缓存机制非常灵活,可以对容器中任意Bean或者Bean的方法进行缓存,因此这种缓存机制可以在JavaEE应用的任何层次上进行缓存. Spring缓存底层也是需要借助其他缓存工具来实现,例 ...
- 8 -- 深入使用Spring -- 5... Spring 3.1 新增的缓存机制
8.5 Spring 3.1 新增的缓存机制 Spring 3.1 新增了一种全新的缓存机制,这种缓存机制与Spring容器无缝地整合在一起,可以对容器中的任意Bean或Bean的方法增加缓存.Spr ...
- 【spring-boot】spring-boot整合ehcache实现缓存机制
EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心 ...
- spring-boot整合ehcache实现缓存机制
EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心 ...
- 以Spring整合EhCache为例从根本上了解Spring缓存这件事(转)
前两节"Spring缓存抽象"和"基于注解驱动的缓存"是为了更加清晰的了解Spring缓存机制,整合任何一个缓存实现或者叫缓存供应商都应该了解并清楚前两节,如果 ...
- Spring控制Hibernate的缓存机制ehcache
首先在spring.xml中进入bean <prop key="hibernate.cache.use_second_level_cache">true</pro ...
- (37)Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】
[本文章是否对你有用以及是否有好的建议,请留言] 写后感:博主写这么一系列文章也不容易啊,请评论支持下. 如果看过我之前(35)的文章这一篇的文章就会很简单,没有什么挑战性了. 那么我们先说说这一篇文 ...
随机推荐
- .net中使用mysql回滚和sqlserver回滚的区别
关于sqlserver事务和mysql事务 首先这是一种方法 public static int GetExecteQuery() { SqlConnection ...
- max函数
无论是几维,都只返回一个最大的值 >>> a = [1,2,3] >>> np.max(a) 3 >>> a = [[2,1],[3,4]] &g ...
- 20165302 学习基础和C语言基础调查
学习基础和C语言基础调查 ====== 一,技能学习经验体会 要问我有什么技能比大多数人强,这个我还真的不敢说,虽然我在很多方面都有自己的一些了解,比如乐器和绘画,但也都是一知半解,并没有在某一方面出 ...
- mysql服务器参数
mysql服务器参数: 配置是从上往下读取,同一个参数项,后边的配置项会覆盖前边的配置项 mysql获取配置信息路径: 命令行参数 mysqld_safe --datadir=/data/sq ...
- php7.0编译安装
1.解压安装 tar zxvf php-7.0.2.tar.gz cd php-7.0.2 2.安装依赖库: yum -y install libjpeg libjpeg-devel libpng ...
- cocos2d-x开发: 一切应该从配置文件读取开始
想要做一款完整的游戏,应该从配置文件读取开始.cocos2d-x本身提供了UserDefault来操作xml格式的配置文件,准确的说配置这模块引擎开发者已经考虑到了.但是xml格式包含大量无关的格式信 ...
- HashMap源码阅读与解析
目录结构 导入语 HashMap构造方法 put()方法解析 addEntry()方法解析 get()方法解析 remove()解析 HashMap如何进行遍历 一.导入语 HashMap是我们最常见 ...
- 你真的了解Scrum吗?
敏捷开发是以用户的需求为核心,采用迭代.循序渐进的方法进行软件开发.而Scrum是实现敏捷开发的具体方式之一.然而你对Scrum又了解多少呢? 什么是Scrum Scrum是橄榄球运动的一个专业术语, ...
- iOS:cocoapods 配置相关(19-04-02更)
1.gem sources 2.libwebp 1.gem sources 因为,mac更新,cocoapods也要更新,使用下面指令,提示找不到.org,原因是淘宝的镜像源.org换成.com,所以 ...
- BZOJ 2648: SJY摆棋子(K-D Tree)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 6051 Solved: 2113[Submit][Status][Discuss] Descript ...