spring boot中的@Cache

#启用基于注解的缓存
使用@EnableCaching,在Application中声明Caching

@EnableCaching
@SpringBootApplication
public class SpringbootApplication {

}

#在Server层的代码中使用@Cacheable
Cacheable属性:
cacheNames/value:缓存组名称
key:缓存数据(map结构)使用的key,默认是传入的值,例如查询id=1,缓存这条数据的key就为1
condition:设置缓存条件,符合条件才缓存
unless:否定缓存,符合条件就不缓存
sync:是否使用异步模式

@Service
public class EmployeeService {

	@Autowired
	EmployeeMapper employeeMapper;
	
	/**
	 * @Cacheable
	 * 	将方法的运行结果进行缓存,之后请求相同的数据,从缓存中获取,不再调用方法
	 * 		condition:第一个参数(id)的值大于1才缓存
	 * 		unless:第一个参数(id)的值等于2不缓存
	 */
	@Cacheable(cacheNames = "emp",condition = "#a0>1",unless = "#a0==2")
	public Employee getEmpById(Integer id) {
		System.out.println("查询" + id + "号员工");
		Employee employee = employeeMapper.getEmpById(id);
		return employee;
	}
	......
}

缓存的数据实际是保存在ConcurrentMapCache中的ConcurrentMap中,cacheNames/value是这个Map的名称,key默认是传入参数,但是通过SpEL命令规则可以自定义key。

第一次发送查询请求后,可在控制台看到数据查询的SQL语句,第二次查询时,没有打印,说明缓存成功。但是查询1号员工不会缓存,因为不满足condition条件,查询2号员工也不会缓存,因为满足unless条件。

#在Server层的代码中使用@CachePut

	/**
	 * @CachePut
	 * 	既调用方法,又更新缓存
	 */
	@CachePut(cacheNames = "emp",key = "#employee.id")
	public Employee updateEmp(Employee employee) {
		System.out.println("更新" + employee.getId() + "号员工");
		employeeMapper.updateEmp(employee);
		return employee;
	}

使用@CachePut注解,在更新Employee表信息后,也会更新缓存中的数据。例如更新3号员工的邮箱后,再次查询3号员工的信息,发现即使没有查询数据库中信息,展示信息依然发生了改变。
注解中,cacheNames必须与上面的查询保持一致,key同样也要实际一致,才能正常更新缓存中的数据。

#在Server层的代码中使用@CacheEvict

	/**
	 * @CacheEvict
	 * 	清理缓存
	 * 		allEntries:是否清理全部缓存
	 * 		beforeInvocation:是否在方法执行之前执行缓存清空
	 * 			默认false,方法发生异常,缓存不会被情空
	 * 			改为true,无论方法是否正常执行,缓存都会被清空
	 */
	@CacheEvict(cacheNames = "emp", allEntries = false, beforeInvocation = false)
	public int deleteEmpById(Integer id) {
		System.out.println("删除" + id + "号员工");
		return employeeMapper.deleteEmpById(id);
	}

使用@CacheEvict注解,在删除Employee表中4号信息后,也会清理掉缓存中4号的数据。通过设置allEntries为true,当执行完某个特定方法后,清空cacheName指定的ConcurrentMap。
注解中,cacheNames和key必须与上面的查询保持一致

#最后还有一个@Caching,定义复杂的缓存规则

/**
	 * @Caching
	 * 	定义复杂的缓存规则
	 */
	@Caching(
		cacheable = {
				@Cacheable(cacheNames = "emp",key = "#employee.id")
		},
		put = {
				@CachePut(cacheNames = "emp",key = "#employee.id"),
				@CachePut(cacheNames = "emp",key = "#employee.lastName")
		}
	)
	public Employee insertEmp(Employee employee) {
		System.out.println("新增" + employee.getId() + "号员工");
		employeeMapper.insertEmp(employee);
		return employee;
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值