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的记录。控制台会再次打印一次测试缓存。

以上只是学习所做的笔记,如有错误请指正。谢谢啦!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值