@Cacheable 注解用于查询的操作,首先从缓存中查找,如果缓存不存在,就去数据库查,然后将查询的结果写入缓存。
启动类上需要 @EnableCaching
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application .class,args);
}
}
@Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法。
@GetMapping("gettoken")
@Cacheable(value = "member#PT1H", key = "'qywxmodel:token:'+ #corpid", condition = "#language = 1")
Map<String, Object> gettoken(@RequestParam("corpid")String corpid, @RequestParam("corpsecret")String corpsecret);
@Cacheable注解三个属性。
value : 必须要的。就是个自己取的名字,通过它指明了第一次调用这个方法时返回的bookList将被存在内存的哪里。
key : 可选。要使用SpEL表达式,这里与参数username对应,当传入的username值变了的话就不去取缓存里的数据了,而是执行getBooksByUsernameAndLanguage方法。(这是必须的,因为username变了,返回值也就变了,缓存里的数据不符合了,因此这个选项很重要)。spring默认用方法的签名来当做key。
condition:方法返回的结果bookList,要不要缓存起来?condition就添加了一个限定条件。这个例子中,只有传入的语言代码是1,返回的bookList才会被缓存起来,如果给language传了别的值,那么bookList是不会缓存起来的。
那么需要更新缓存怎么操作呢,这是需要@CachePut
@Cacheable 的逻辑是:查找缓存 - 有就返回 -没有就执行方法体 - 将结果缓存起来;
@CachePut 的逻辑是:执行方法体 - 将结果缓存起来;
所以 @Cacheable 适用于查询数据的方法,@CachePut 适用于更新数据的方法。
/**
* 内部员工缓存信息
* @param phone
* @param status
* @param b
* @param messge
* @return
*/
@CachePut(value = "member#PT5M", key = "'employee:' + #phone")
public Map<String, Object> employee(String phone,String status , boolean b ,String messge ) {
Map<String, Object> resMap = new HashMap<>();
resMap.put("phone", phone);
resMap.put("status", status);
resMap.put("flag", b);
resMap.put("messge",messge);
return resMap;
}