`
huangcanqin
  • 浏览: 28793 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring 3 缓存

 
阅读更多

下面简单介绍一下spring3.1.M1中的cache功能。

spring3.1.M1中负责cache的模块是org.springframework.context-3.1.0.M1.jar

 

与2.5时的modules模块类似,3.1的注解缓存也是在方法上声明注解,3.1同样提供了两个注解:

@Cacheable:负责将方法的返回值加入到缓存中

@CacheEvict:负责清除缓存

 

@Cacheable 支持如下几个参数:

value:缓存位置名称,不能为空,如果使用EHCache,就是ehcache.xml中声明的cache的name

key:缓存的key,默认为空,既表示使用方法的参数类型及参数值作为key,支持SpEL

condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL

 

例如:

//将缓存保存进andCache,并使用参数中的userId加上一个字符串(这里使用方法名称)作为缓存的key
@Cacheable(value="andCache",key="#userId + 'findById'")
public SystemUser findById(String userId) {
SystemUser user = (SystemUser) dao.findById(SystemUser.class, userId);
return user ;
}
//将缓存保存进andCache,并当参数userId的长度小于32时才保存进缓存,默认使用参数值及类型作为缓存的key
@Cacheable(value="andCache",condition="#userId.length < 32")
public boolean isReserved(String userId) {
System.out.println("hello andCache"+userId);
return false;
}

 

@CacheEvict 支持如下几个参数:

value:缓存位置名称,不能为空,同上

key:缓存的key,默认为空,同上

condition:触发条件,只有满足条件的情况才会清除缓存,默认为空,支持SpEL

allEntries:true表示清除value中的全部缓存,默认为false

 

例如:

 

//清除掉指定key的缓存
@CacheEvict(value="andCache",key="#user.userId + 'findById'")
public void modifyUserRole(SystemUser user) {
System.out.println("hello andCache delete"+user.getUserId());
}

&nbsp;//清除掉全部缓存
@CacheEvict(value="andCache",allEntries=true)
public final void setReservedUsers(String[] reservedUsers) {
System.out.println("hello andCache deleteall");
}

一般来说,我们的更新操作只需要刷新缓存中某一个值,所以定义缓存的key值的方式就很重要,最好是能够唯一,因为这样可以准确的清除掉特定的缓存,而不会影响到其它缓存值

比如我这里针对用户的操作,使用(userId+方法名称)的方式设定key值当然,你也可以找到更适合自己的方式去设定。

 

SpEL:Spring Expression Language

关于SpEL的介绍,可以参考如下地址:

http://static.springsource.org/spring/docs/3.1.0.M1/spring-framework-reference/html/expressions.html

 

 

了解了cache的注解之后,接下来说说如何使注解生效,其实就是需要在spring的配置文件中增加一些配置。

 

1.spring-cache

首先我们来看一下如何使用spring3.1自己的cache,

需要在命名空间中增加cache的配置

Xml代码 复制代码
  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  3.      xmlns:cache="http://www.springframework.org/schema/cache"
  4.     xsi:schemaLocation="
  5.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  6.             http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">
<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"
	xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
			http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">

 

之后添加如下声明:

Xml代码 复制代码
  1.       <!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 -->
  2. <cache:annotation-driven cache-manager="cacheManager"/>
  3. <!-- spring自己的换管理器,这里定义了两个缓存位置名称 ,既注解中的value -->
  4. <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
  5.     <property name="caches">
  6.         <set>
  7.             <bean
  8.                 class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"
  9.                 p:name="default" />
  10.             <bean
  11.                 class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"
  12.                 p:name="andCache" />
  13.         </set>
  14.     </property>
  15. </bean>
       <!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 -->
	<cache:annotation-driven cache-manager="cacheManager"/>

	<!-- spring自己的换管理器,这里定义了两个缓存位置名称 ,既注解中的value -->
	<bean id="cacheManager">
		<property name="caches">
			<set>
				<bean
					class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"
					p:name="default" />
				<bean
					class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"
					p:name="andCache" />
			</set>
		</property>
	</bean>

 

2.spring-ehcache

接下来说说对ehcache的支持,其实只需要把cacheManager换成EHCache的cacheManager即可,如下:

Java代码 复制代码
  1.        <!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 -->
  2. <cache:annotation-driven cache-manager="cacheManager"/>
  3. <!-- cacheManager工厂类,指定ehcache.xml的位置 -->
  4. <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
  5.     p:configLocation="classpath:/config/ehcache.xml" />
  6. <!-- 声明cacheManager -->
  7. <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
  8.     p:cacheManager-ref="cacheManagerFactory" />
        <!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 -->
	<cache:annotation-driven cache-manager="cacheManager"/>

	<!-- cacheManager工厂类,指定ehcache.xml的位置 -->
	<bean id="cacheManagerFactory"
		p:configLocation="classpath:/config/ehcache.xml" /> 

	<!-- 声明cacheManager -->
	<bean id="cacheManager"
		p:cacheManager-ref="cacheManagerFactory" />

 ehcache.xml

Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.     xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
  4.     monitoring="autodetect">
  5.     <!--
  6.     <diskStore path="java.io.tmpdir" /> -->
  7.     <diskStore path="E:/cachetmpdir"/>
  8.     <defaultCache maxElementsInMemory="10000" eternal="false"
  9.         timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
  10.         maxElementsOnDisk="10000000" diskPersistent="false"
  11.         diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" />
  12.     <cache name="andCache" maxElementsInMemory="10000"
  13.         maxElementsOnDisk="1000" eternal="false" overflowToDisk="true"
  14.         diskSpoolBufferSizeMB="20" timeToIdleSeconds="300" timeToLiveSeconds="600"
  15.         memoryStoreEvictionPolicy="LFU" />
  16. </ehcache>
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
	monitoring="autodetect">
	<!--
	<diskStore path="java.io.tmpdir" /> -->
	<diskStore path="E:/cachetmpdir"/>
	<defaultCache maxElementsInMemory="10000" eternal="false"
		timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
		maxElementsOnDisk="10000000" diskPersistent="false"
		diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" />

	<cache name="andCache" maxElementsInMemory="10000"
		maxElementsOnDisk="1000" eternal="false" overflowToDisk="true"
		diskSpoolBufferSizeMB="20" timeToIdleSeconds="300" timeToLiveSeconds="600"
		memoryStoreEvictionPolicy="LFU" />
</ehcache>

 

 

ok,这样注解缓存就生效了。

分享到:
评论

相关推荐

    spring简单的缓存

    3. **使用缓存注解**: - `@Cacheable`:此注解用于标记那些结果可以被缓存的方法。当方法被调用时,其结果会被存储在指定的缓存中,下次调用时,如果缓存中有该结果,将直接返回,不再执行方法体。 - `@...

    Spring 缓存

    Spring 缓存机制详解 Spring 缓存机制是 Spring 框架中的一种机制,用于提高应用程序的性能和效率。缓存机制可以将频繁访问的数据存储在内存中,以便快速地检索数据,减少数据库查询的次数,从而提高应用程序的性能...

    09. Spring Boot缓存技术

    当我们谈论"Spring Boot缓存技术"时,实际上是在讨论如何在Spring Boot应用中有效地管理和利用缓存,以提高系统的性能和响应速度。缓存技术是解决高并发场景下数据访问延迟的有效手段,它通过将常用数据存储在内存中...

    基于Spring的Web缓存

    在实现Spring缓存时,你需要确保引入了相应的库,如`spring-boot-starter-cache`或`spring-context-support`,它们包含了Spring缓存支持所需的类和接口。同时,如果你打算使用特定的缓存实现,如EhCache或Redis,还...

    spring缓存机制-入门实例

    本篇文章将深入探讨Spring缓存机制的基础知识,并通过一个入门实例来阐述其工作原理和使用方法。 Spring缓存抽象是自Spring 3.1版本引入的,它提供了一个统一的API,支持多种缓存解决方案,如EhCache、Guava Cache...

    spring-cache(通过key值更新缓存)

    3. **@Caching**:如果需要组合多个缓存操作,可以使用`@Caching`。它允许你在一个方法上组合`@Cacheable`、`@CachePut`和`@CacheEvict`注解。 4. **KeyGenerator**:Spring Cache默认提供了一种基于所有方法参数的...

    Spring+EhCache缓存实例

    **Spring+EhCache缓存实例详解** 在现代的Java企业级应用中,缓存技术扮演着至关重要的角色,它能够显著提升系统性能,减少数据库负载。Spring框架与EhCache的结合,为开发者提供了一种高效、易用的缓存解决方案。...

    springboot 使用spring cache缓存 和 使用fastjson配置redis系列化

    在Spring Boot应用中,Spring Cache是一个强大的工具,用于在应用程序中实现缓存抽象,它可以减少对数据库或远程服务的重复调用,从而提高性能。在本篇文档中,我们将探讨如何使用Spring Cache来缓存数据,并结合...

    spring自动加载缓存

    一、Spring缓存抽象 1. **@Cacheable**:这是最常用的注解,用于标记那些可以被缓存的方法。当方法被调用时,Spring会检查缓存中是否存在对应的结果,如果存在则直接返回,无需再次执行方法;如果不存在,执行方法...

    spring缓存实例

    其中,Spring缓存机制是提高应用程序性能的关键特性,尤其对于数据密集型应用而言。本篇将深入探讨Spring缓存实例,基于给出的博客链接(http://blog.csdn.net/maoyeqiu/article/details/50433934)和文件"20140527...

    spring二级缓存

    3. **Spring配置**:在Spring的配置文件(如`applicationContext.xml`)中,启用缓存支持并指定缓存管理器。使用`&lt;cache:annotation-driven/&gt;`元素开启基于注解的缓存控制,并通过`&lt;bean&gt;`标签配置EhCache的`...

    spring缓存

    3. 在SPRING中运用EHCACHE Spring通过`@Cacheable`、`@CacheEvict`、`@Caching`等注解简化了缓存操作。例如: ```java @Service public class MyService { @Cacheable(value = "myCache", key = "#id") public ...

    Spring缓存配置

    **Spring缓存配置详解** 在Java Web开发中,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,Spring的缓存管理是提升应用性能的关键部分,它允许我们将经常访问但变化不频繁的数据存储在内存中,以减少对...

    spring缓存机制-根据condition加入缓存(三)

    ### 一、Spring缓存概述 Spring框架提供了一种统一的缓存抽象,支持多种缓存实现,如EhCache、Hazelcast、Infinispan、Guava等。通过`@EnableCaching`注解开启缓存功能,并使用`@Cacheable`、`@CacheEvict`、`@...

    Spring Redis缓存实例

    3. **配置Spring Cache**: 在Spring Boot的配置类中,启用`@EnableCaching`注解,并配置`CacheManager`,选择Redis作为缓存实现。 ```java @Configuration @EnableCaching public class CacheConfig { @Bean ...

    springboot 使用spring cache缓存 和 缓存数据落地到redis

    【Spring Boot 使用 Spring Cache 缓存与数据落地到 Redis】\n\n在Spring Boot应用中,Spring Cache是一个强大的工具,可以极大地提升应用的性能,通过缓存非计算性或者昂贵的计算结果。Spring Cache抽象了缓存管理...

    spring缓存机制-自定义缓存(五, 六)

    在“spring缓存机制-自定义缓存(五, 六)”中,我们将深入探讨如何扩展Spring的缓存功能,使其更加灵活且功能丰富。 一、Spring缓存抽象 Spring缓存抽象是基于Java的注解驱动的,它提供了声明式缓存管理。核心组件...

    Java课程实验 Spring Boot 缓存管理

    3.使用缓存注解: 在需要进行缓存的方法上添加缓存注解。例如,使用@Cacheable注解来指定一个方法的结果应该被缓存。 @Cacheable:将方法的结果缓存起来,下次调用该方法时,如果传入的参数相同,则直接返回缓存中的...

    Hibernate缓存与spring事务详解

    **标题:“Hibernate缓存与Spring事务详解”** 在IT领域,尤其是Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。而Spring框架则以其全面的功能,包括依赖注入、AOP(面向切...

    浅析SpringCache缓存1

    3. **缓存键生成**:默认情况下,Spring 使用所有方法参数的哈希值作为缓存键。但是,我们可以自定义键生成策略,通过 `keyGenerator` 属性指定自定义的 KeyGenerator 类,或者使用 SpEL(Spring Expression ...

Global site tag (gtag.js) - Google Analytics