欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring中缓存数据

程序员文章站 2024-03-04 08:23:11
...

概要

使用缓存不会重复去数据库中获取数据。不会花费时间与资源!

启用对缓存的支持

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请求,控制台只输出了一次!
Spring中缓存数据
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;
    }

为方法添加注解以支持缓存

Spring中缓存数据
当将其放在单个方法上时,注解所描述的缓存行为只会运用到这个方法上。如果注解放在类级别的话,那么缓存行为就会应用到这个类的所以方法上。

填充缓存

@Cacheable和@CachePut注解都可以填充缓存,但是它们的工作方式略有差异。
@Cacheable首先在缓存中查找条目,如果找到了匹配的条目,那么就不会对方法进行调用了。如果没有找到匹配的条目,方法会被调用并且返回值要放到缓存之中。而@CachePut并不会在缓存中检查匹配的值,目标方法总是会调用,并将返回值添加到缓存之中。
Spring中缓存数据
最简单的情况下,在@Cacheable和@CachePut的这些属性中,只需要使用value属性指定一个或多个缓存即可。
注:当为接口方法添加注解后,所有接口的实现类都会应用相同的缓存规则。

    @CachePut(value= "admin")
    public Admin getAdmin(int id) {
         System.out.println("测试缓存");
         admin = em.find(Admin.class, id);      
         return admin;
    }

Spring中缓存数据
@CachePut注解的方法总是被调用,而且它的返回值也会放到缓存中!!

自定义缓存key

默认的缓存key是基于方法的参数来确定的。不过@Cacheable和@CachePut都有一个名为key的属性,这个属性能够替换默认的key,它是通过一个SpEL表达式计算得到的。
Spring中缓存数据
例如我们可以将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) {}

Spring中缓存数据

    @CachePut(value= "admin",condition="#result.adminId==4")//false,缓存被禁用
    public Admin getAdmin(int id) {}

Spring中缓存数据
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 Cache