在软件开发中使用缓存已经有一个非常久的历史了。缓存是一种很好的设计思想,一旦你用了他,你将会发现他确实很有用。Spring3.1版本的核心对缓存做了实现。在Java推出Annotation特性之前,实现缓存的一个难点在于它与业务逻辑代码的耦合性太强。
然而,Spring3.1中使用@Cacheable 和@CacheEvict实现缓存在某种程度上解决了这个问题,基本思想是在方法加上@Cacheable注解,这个方法的返回值将具有缓存特性。
@Cacheable注解可以用在方法或者类级别。当他应用于方法级别的时候,就是如上所说的缓存返回值了。当应用在类级别的时候,这个类的所有方法的返回值都将被缓存。
@Cacheable(value = "employee")
public class EmployeeDAO {
public Person findEmployee(String firstName, String surname, int age) {
return new Person(firstName, surname, age);
}
public Person findAnotherEmployee(String firstName, String surname, int age) {
return new Person(firstName, surname, age);
}
}
@Cacheable注解有三个参数,value是必须的,还有key和condition。第一个参数,也就是value指明了缓存将被存到什么地方。
@Cacheable(value = "employee")
public Person findEmployee(String firstName, String surname, int age) {
return new Person(firstName, surname, age);
}
上面的代码保证findEmployee的返回值Person对象将被存储在"employee"中。
任何存储在缓存中的数据为了高速访问都需要一个key。Spring默认使用被@Cacheable注解的方法的签名来作为key,当然你可以重写key,自定义key可以使用SpEL表达式。
@Cacheable(value = "employee", key = "#surname")
public Person findEmployeeBySurname(String firstName, String surname, int age) {
return new Person(firstName, surname, age);
}
在findEmployeeBySurname()的注解中"#surname"是一个SpEL表达式,他将使用findEmployeeBySurname()方法中的surname参数作为key。
@Cacheable的最后一个参数是condition(可选),同样的,也是引用一个SpEL表达式。但是这个参数将指明方法的返回结果是否被缓存。
@Cacheable(value = "employee", condition = "#age < 25")
public Person findEmployeeByAge(String firstName, String surname, int age) {
return new Person(firstName, surname, age);
}
上面的例子中,只有年龄小于25的时候才被缓存。
在快速看完了如何使用缓存后,我们接下来看看缓存带来的效果。
<A href="http://my.oschina.net/test45" target=_blank rel=nofollow>@Test</A>
public void testCache() {
Person employee1 = instance.findEmployee("John", "Smith", 33);
Person employee2 = instance.findEmployee("John", "Smith", 33);
assertEquals(employee1, employee2);
}
上面的例子很简单,第一次调用findEmployee,findEmployee方法将被执行,Spring将他的返回值一个person对象存入缓存。第二次调用findEmployee的时候findEmployee将不被执行,Spring直接将缓存中的数据作为返回值返回。所以employee1 和employee2引用了同样的对象。
而下面的例子中,我们将年龄小于25作为缓存条件,就将得到不同的结果。
<A href="http://my.oschina.net/test45" target=_blank rel=nofollow>@Test</A>
public void testCacheWithAgeAsCondition() {
Person employee1 = instance.findEmployeeByAge("John", "Smith", 33);
Person employee2 = instance.findEmployeeByAge("John", "Smith", 33);
assertEquals(employee1, employee2);
}
下面的例子我们在findEmployeeBySurname的方法的注解中自定义了key,我们使用了自定义的key生成方式,以确保不同的surname将会指向不同的人。看下面的程序
<A href="http://my.oschina.net/test45" target=_blank rel=nofollow>@Test</A>
public void testCacheOnSurnameAsKey() {
Person employee1 = instance.findEmployeeBySurname("John", "Smith", 22);
Person employee2 = instance.findEmployeeBySurname("Jack", "Smith", 55);
assertEquals(employee1, employee2);
}
我们想找到两个不同的人,但是两个人的surname是相同的,你将发现两次调用返回了相同的结果,这不是Spring的问题,而是我们的cache key的生成方式有问题。所以在我们定义key的时候要小心注意key的生成策略,避免造成这种问题。
最后总结一下流程,当执行到一个被@Cacheable注解的方法时,Spring首先检查condition条件是否满足,如果不满足,执行方法,返回;如果满足,在value所命名的缓存空间中查找使用key存储的对象,如果找到,将找到的结果返回,如果没有找到执行方法,将方法的返回值以key-对象的方式存入value缓存中,然后方法返回。
上文仅仅是@Cacheable的使用方法,但是我们怎么使用@CacheEvict注解来清除缓存呢?另外,还有一个问题,如何选择一个缓存的实现,并配置Spring的缓存呢?
@Cacheable:当重复使用相同参数调用方法的时候,方法本身不会被调用执行,即方法本身被略过了,取而代之的是方法的结果直接从缓存中找到并返回了。
@CachePut:这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中。
@cachePut相当于Update()操作,只要他标示的方法被调用,那么都会缓存起来,而@cache则是先看下有没已经缓存了,然后再选择是否执行方法。@CacheEvict相当于Delete()操作。用来清除缓存用的。
@CacheEvict 主要的参数
- 大小: 46.2 KB
分享到:
相关推荐
spring + redis使用@Cacheable,@CachePut,@CacheEvict详细步骤
在Spring3.1以后增加了一项happy的技术点,就是基于注解来实现缓存的技术。他的本质上不是具体的缓存方案实现,而是一个对缓存的抽象,让我们通过注解,实现少量的代码,达到实现缓存的方案。 Cacheable的说明 @...
3.1、spring boot redis注解缓存Cacheable (value) 1
主要介绍了详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用,非常具有实用价值,需要的朋友可以参考下
通过spring-cache对方法进行缓存,同时验证如何通过key更新指定的缓存!
关于@Cacheable注解在方法上根据请求参数拉起缓存内容,同时@CacheEvict 注解在方法上清空指定key缓存的原理内容
在Spring体系中使用redis.zip spring集成redis缓存
在Spring Boot中,你可以使用Spring框架提供的缓存管理来提高应用程序的性能。Spring Boot支持多种缓存实现,包括内存缓存和分布式缓存。...通过以上步骤,可以在Spring Boot中使用缓存管理器来提高应用程序的性能。
1、#加变量名字,就可以表示变量了, 比如 #id2、使用对象中的变量 #user.id 或者#user.getId() 都可以condition:触发条件,只
只要发生删改查,就把集合类缓存销毁对于查询方法:@Cacheable(value=“obj”) 或 @Cacheable(value=“objList”)对于修
spring缓存中用conditon限制放入缓存的数据。
缓存是实际工作中非经常常使用的一种提高性能的方法, 我们会在很多场景下来使用缓存。下面这篇文章主要给大家介绍了关于Spring Cache的基本使用与实现原理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友...
SpringMVC集成Redis进行缓存管理,SpringMVC基于接口编程的实例,从代码中学习Spring是怎么集成缓存。
Springcache中如何来实现缓存的更新呢?不错,@CachePut就能帮助我们来实现缓存的更新。 有的时候我们可以将@CachePut就是一个触发器,虽然这样说不太正确,但是很有助于我们的理解,当我们每次调用被他注解的方法...
本篇文章主要介绍了spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用,具有一定的参考价值,有兴趣的可以了解一下。
redis : 1、添加依赖 pom.xml 2、主入口添加注解@EnableCaching 获取缓存方法添加@Cacheable 3、初始化缓存管理器 4 实现put get方法 其中一个put方法添加了过期时间 5 调用方法获取缓存 注意需要在本地部署redis...
3. Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用 3 3.1. @Cacheable 4 3.2. @CachePut 6 3.3. @CacheEvict 7 3.4. @Caching 8 3.5. 使用自定义注解 8 4. 使用Lettuce 操作redis单机版和redis集群 9
主要介绍了Spring Cache手动清理Redis缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
这个代码是Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用和不使用的对比,只是简单的使用
此注解表明在进入方法之前,Spring 会先去缓存服务器中査找对应 key 的缓存值,如果找到缓存值,那么 Spring 将不会再调用方法,而是将缓存值读出,返回给调用者;如果没有找到缓存值,那么 Spring 就会执行你的...