整合redis;引入redis的starter spring-boot-starter-data-redis
测试缓存
cachemanageer==cache缓存组件来实际给缓存中存取数据
1.引入redis的starter容器保存的时rediscachemanager
2.rediscachemanager帮我们创建rediscache来作为缓存组件,rediscacahe通过操作redis缓存数据
3.默认保存数据k-v利用序列化保存应当使用json保存:引入redis的starter,cachemanager变为rediscachemanager
默认创建的rediscachemanager操作redis的时候使用的是redistemplate<object,object>默认使用的是jdk序列化机制
因此需要自定义cachemanager
在main方法上加上@EnableCaching注解
@SpringBootApplication
@MapperScan("cn.ncu.springbootcache.mapper")
@EnableCaching
public class SpringbootCacheApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootCacheApplication.class, args);
}
}
缓存注解介绍以及使用(Service层):
@CacheConfig(cacheNames = "emp")//抽取缓存公共配置
@Service
public class EmployeeService {
@Resource
EmpMapper empMapper;
/*
将方法的运行结果进行缓存,以后再要相同的数据直接可以从缓存中获取,不再调用方法,不用调用数据库进行查询了
CacheManager:管理多个cache组件,对于真正的crud操作在cache组件中,每一个缓存组件中有自己唯一一个名字
@Cacheable的几个属性:
cacheNames/value:缓存的名字:,将方法的返回结果放在哪个缓存中,是数组的方式,可以指定多个缓存
key:缓存数据使用的key,可以用它来指定,默认使用是方法的值,举例键值对:1-方法的返回值
编写SpEl比如#id就是参数id的值 #a0 #p0 #root.args[0]
举例:getEmp[2]=>key="#root.methodName+'['+#id+']'"
keyGenerator:key的生成器:可以自己指定key的生成器组件id,key/keyGenerator二选一 编写MyCacheConfig配置类 keyGenerator = "myKeyGenerator"
cacheManager:指定缓存管理器:或者cacheReslover缓存解析器,这两个也是二选一
condition:指定符合条件的情况下,才缓存; condition = "#id>0"或者condition = "#a0>1":第一个参数的值大于1时才缓存
unless:否定缓存,当unless指定的条件weitrue,方法的返回值就不会被缓存(除非),unless在使用时可以获取到结果进行判断
unless="#result==null" unless = "#a0==2":如果第一个参数的值为2结果不缓存
sync:是否使用异步
调用方法之前先看缓存中有没有指定key要用的数据,如果没有再调方法
*/
@Cacheable(cacheNames = {"emp"})//keyGenerator = "myKeyGenerator",condition = "#a0>1"
public Employee getEmpByid(Integer id){
Employee employee=empMapper.getEmpById(id);
System.out.println("查询:"+id+"号员工");
return employee;
}
/**
* @CachePut:既调用方法又更新缓存,同步更新缓存
* 修改了数据库的某个数据同时更新缓存;
* 运行时机
* 1.先调用方法
* 2.将目标方法的结果缓存起来
* 测试步骤:
*1.先查询1号员工,查到的结果会放在缓存中
* 2.以后查询还是之前的结果
* 3.更新一号员工
* 4.再次查询1号员工发现还是之前的数据,这是因为1号员工在缓存中没有进行更新(key不一样),需要指定key
* key = "#employee.id":使用传入的参数的员工id key="result.id":使用返回后的id,这两种写法都一样
*/
@CachePut(value = "emp",key = "#employee.id")
public Employee updateEmp(Employee employee){
empMapper.updateEmp(employee);
System.out.println("updateEmp:"+employee);
return employee;
}
/**
* @CacheEvict:缓存清除
* 通过key指定要清除的数据
* ,allEntries = true:缓存数据都删除
* ,beforeInvocation =false:缓存的清除是否在方法执行之前执行,默认代表是在方法执行之后执行,如果出现异常缓存就不会被清除
* beforeInvocation =true:无论方法是否出现异常缓存都会被清除
*/
@CacheEvict(value = "emp",key = "#id" )
public void deleteEmp(Integer id){
System.out.println("delete:"+id);
empMapper.deleteEmp(id);
}
//定义复杂的缓存注解
@Caching(
cacheable = {
@Cacheable(value = "emp",key = "#lastName")
},
put = {
@CachePut(value = "emp",key = "#result.id"),
@CachePut(value = "emp",key = "#result.email")
}
)
public Employee getEmpByLastName(String lastName){
return empMapper.getEmpBylastName(lastName);
}
}
```