使用@Cacheable时,该方法支持缓存,有两种key的生成方法
- @Cacheable(value = “getUser”,keyGenerator = “cacheKeyGenerator”),
这个是使用RedisConfiguration中声明的方法cacheKeyGenerator,
会根据自己实现的策略生成一个key,本项目中使用的是,根据方法名和参数实现(com.example.demo.service.UserServicegetUserlinjiayong12) - @Cacheable(value = “getUser”,key= “#userName”) 通过参数key来实现(linjiayong12),传入参数设置key,利用#,如传入的参数是User user对象,可以通过key= “#getUserName”,混合设置,传入多个参数可以组合使用@Cacheable(value = “getUser”,key= “#userName+#userName”)
参考:http://blog.csdn.net/whatlookingfor/article/details/51833378
http://blog.csdn.net/wjacketcn/article/details/50945887
@Cacheable(value = "getUser",key= "#userName")
public User getUser(String userName){
System.out.println("正在查询数据库");
User user = new User();
user.setUserCode("2222");
user.setUserName(userName);
return user;
}
对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。
在使用缓存操作时,需要考虑到数据库和缓存一致性问题。CRUD (Create 创建,Retrieve 读取,Update 更新,Delete 删除) 操作中,除了 查询R操作,其他三个发生的时候都可能会造成缓存结果和数据库不一致。为了保证缓存数据的一致性,在进行 CUD 操作的时候需要对可能影响到的缓存进行更新或者清除。
在执行更新或者插入操作时,可以通过该CachePut注解,将调用结果放入缓存中。保持数据库和缓存一致性。
在@CachePut注解时需要注意使用的是,keyGenerator和key,在使用keyGenerator时,
生成的key需要与 @Cacheable生成的key是一致的,否则再做CU操作时,不会更新@Cacheable的缓存。
@CachePut(value = "getUser",key = "#userName")
// @CachePut(value = "getUser",keyGenerator = "cacheKeyGenerator")
public User updateUser(String userName){
System.out.println("正在设置数据库");
System.out.println(userName);
User user = new User();
user.setUserCode("323");
user.setUserName(userName);
return user;
}
@CachePut声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以存入缓存中。
在进行删除操作时,需要删除缓存中的数据。
- 可以通过指定条件删除缓存中的的数据
- 可以删除指定缓存中的所有数据
@CacheEvict(value="getUser",key = "#user.userName")// 根据key清空getUser 缓存
//@CacheEvict(value="getUser",allEntries=true)// getUser 缓存
public void delUser( User user){
System.out.println("正在删除表中数据");
System.out.println(user.getUserName());
}
@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空
在上述的几个注解中,都可以传入参数 condition
- condition为 缓存的条件
- 可以为空
- 使用 SpEL 编写
- 返回 true 或者 false
只有为 true 才进行缓存
例子
@Cacheable(value=”getUser”,condition=”#userName.length() <=4”) 只有长度小于才进行缓存