SpringBoot整合@Cacheable与@CacheEvict的使用

@Cacheable的作用:把方法的返回值添加到Ehcache中做缓存
value属性:指定一个Ehcache配置文件中的缓存策略,如果没有给定value,则使用默认的缓存策略

 
    
        
    

key:给存储值取个名字,如果查询的时候有相同的名称,那么就从缓存中将数据拿出来
业务层代码如下

@Override
	@Cacheable(value="users",key="#pageable.pageSize")
	public Page findUserByPage(Pageable pageable) {
		// TODO Auto-generated method stub
		return this.usersRepository.findAll(pageable);
	}

   

测试代码与结果如下

@Test
   public void testFindUserByPage(){
   	Pageable pageable = new PageRequest(0, 2);
   	//第一次查询
   	System.out.println(this.usersService.findUserByPage(pageable).getTotalElements());
   	//第二次查询
   	System.out.println(this.usersService.findUserByPage(pageable).getTotalElements());
   	
   	//第三次查询
   	pageable = new PageRequest(1, 2);
   	System.out.println(this.usersService.findUserByPage(pageable).getTotalElements());
   }

在这里插入图片描述
由结果可以看出,就执行了一次查询工作,后两个值都是从缓存中拿出来的



@CacheEvict的作用:它的作用就是清除缓存
在没有清除缓存的时候在两个查询中间进行一个添加操作


	@Test
	public void testFindAll(){
		//第一次查询
		System.out.println(this.usersService.findUserAll().size());
		
		//添加一条数据
		Users users = new Users();
		users.setAddress("南京");
		users.setAge(22);
		users.setName("武则天");
		this.usersService.saveUsers(users);
		
		//第二次查询
		System.out.println(this.usersService.findUserAll().size());
	}

运行结果如下
在这里插入图片描述
很明显,插入数据是成功的,但是第二次查询的时候还是没有插入数据之前的结果,所以在对数据进行更改后,需要进行清除缓存的操作
业务层代码如下

@Override
	/**
	 * 清除以users为name的对象的缓存
	 * value的属性是指定你需要清除哪一个缓存策略下的缓存
	 */
	@CacheEvict(value="users",allEntries=true)	
	public void saveUsers(Users users) {
		// TODO Auto-generated method stub
		this.usersRepository.save(users);
	}

然后再次运行测试代码的结果如下
SpringBoot整合@Cacheable与@CacheEvict的使用_第1张图片
这样就没有问题了,相当于添加了一个同步更新操作

你可能感兴趣的:(java,SpringBoot,@CacheEvict,@Cacheable)