Spring中缓存数据
概要
使用缓存不会重复去数据库中获取数据。不会花费时间与资源!
启用对缓存的支持
RootConfig.java
@Bean
public CacheManager cacheManager()
{
return new ConcurrentMapCacheManager();
}
SpringMVC配置文件WebConfig.java
@EnableCaching
测试
@RequestMapping("/testCache")
public String testCache()
{
int id = 3;
testService.getAdmin(id);
return null;
}
public Admin getAdmin(int id) {
return testDao.getAdmin(id);
}
@Cacheable(value= "admin")//见下文描述
public Admin getAdmin(int id) {
System.out.println("测试缓存");
admin = em.find(Admin.class, id);
return admin;
}
多次访问/testCache请求,控制台只输出了一次!
ConcurrentMapCacheManager这个简单的缓存管理器使用了java.util.concurrent.ConcurrentMap作为其缓存存储。它非常简单,因此对于开发、测试或基础的应用来讲是个,是个不错的选择。但它的缓存存储是基于内存的,所以重启服务器缓存就会请空。
配置缓存管理器
Spring3.1内置了五个缓存管理器实现:
- SimpleCacheManager
- NoOpCacheManager
- ConcurrentMapCacheManager
- CompositeCacheManager
- EhCacheCacheManager
Spring Data又提供了两个缓存管理器:
- RedisCacheManager(来自于Spring Data Redis项目)
- GemfireCacheManager(来自于Spring Data Gemfire项目)
使用Ehcache缓存
略!
使用Redis缓存
RootConfig.java
//Redis缓存管理器bean
@Bean
public CacheManager cacheManager(RedisTemplate<String, String> redisTempl)
{
return new RedisCacheManager(redisTempl);
}
//Redis连接工厂bean
@Bean
public RedisConnectionFactory redis()
{
return new JedisConnectionFactory();
}
//RedisTemplate bean
@Bean
public RedisTemplate<String, String> redisTempl(RedisConnectionFactory redis)
{
RedisTemplate<String, String> redisTempl = new RedisTemplate<String, String>();
redisTempl.setConnectionFactory(redis);
return redisTempl;
}
为方法添加注解以支持缓存
当将其放在单个方法上时,注解所描述的缓存行为只会运用到这个方法上。如果注解放在类级别的话,那么缓存行为就会应用到这个类的所以方法上。
填充缓存
@Cacheable和@CachePut注解都可以填充缓存,但是它们的工作方式略有差异。
@Cacheable首先在缓存中查找条目,如果找到了匹配的条目,那么就不会对方法进行调用了。如果没有找到匹配的条目,方法会被调用并且返回值要放到缓存之中。而@CachePut并不会在缓存中检查匹配的值,目标方法总是会调用,并将返回值添加到缓存之中。
最简单的情况下,在@Cacheable和@CachePut的这些属性中,只需要使用value属性指定一个或多个缓存即可。
注:当为接口方法添加注解后,所有接口的实现类都会应用相同的缓存规则。
@CachePut(value= "admin")
public Admin getAdmin(int id) {
System.out.println("测试缓存");
admin = em.find(Admin.class, id);
return admin;
}
@CachePut注解的方法总是被调用,而且它的返回值也会放到缓存中!!
自定义缓存key
默认的缓存key是基于方法的参数来确定的。不过@Cacheable和@CachePut都有一个名为key的属性,这个属性能够替换默认的key,它是通过一个SpEL表达式计算得到的。
例如我们可以将key设置为Admin的adminId字段。
@CachePut(value= "admin",key="#result.adminId")
public Admin getAdmin(int id) {}
条件化缓存
@Cacheable和@CachePut提供了两个属性用以实现条件化缓存:unless和condition,这两个属性都接受一个SpEL表达式。如果unless属性的SpEL表达式计算结果为true,那么缓存方法返回的数据就不会放到缓存中。与之类似,如果condition属性的SpEL表达式计算结果为false,那么对于这个方法缓存就会被禁用掉。
表面上看,unless和condition属性都是做相同的事情。但是,它们有一点细微的差别。unless属性只能阻止将对象放进缓存,但是在这个方法调用的时候,依然会去缓存中进行查找,如果找到了匹配的值,就会返回找到的值。与之不同,如果condition的表达式计算结果为false,那么在这个方法调用的过程中,缓存是被禁用的。就是说,不会去缓存进行查找,同时返回值也不会放进缓存中。
例如:在数据库查找adminId==3的记录。
@CachePut(value= "admin",unless="#result.adminId==3")//true,数据不会放到缓存中。
public Admin getAdmin(int id) {}
@CachePut(value= "admin",condition="#result.adminId==4")//false,缓存被禁用
public Admin getAdmin(int id) {}
unless和condition是可以组合使用的。
移除缓存条目
带有@CacheEvict注解的方法被调用的话,那么会有一个或更多的条目会在缓存中移除。
多次调用,控制台只会打印一次测试缓存
@Cacheable(value= "admin")
public Admin getAdmin(int id) { //例如,查找id为3的记录
System.out.println("测试缓存");
admin = em.find(Admin.class, id);
return admin;
}
现在删除一条记录
@CacheEvict("admin")
public void delAdmin(int id) {} //删除id为3的记录
再次调用 getAdmin()方法,查找id为3的记录。控制台会再次打印一次测试缓存。
以上只是学习所做的笔记,如有错误请指正。谢谢啦!
上一篇: 鼠标悬停效果
下一篇: Spring 3.1 配置cache详解