1.@Cacheable
1.1 概述:
(1)标记在类上:表示该类所有的方法都是支持缓存的。
(2)标记在方法上:如果一个方法上添加了@Cacheable标记,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。
1.2.用法:
(1)@Cacheable可以指定三个属性,value、key和condition。value必须指定,表示当前方法的返回值会被缓存在哪个Cache上,对应Cache的名称。可以是一个Cache也可以是多个Cache,当需要指定多个Cache时其是一个数组。
@Cacheable("cache1")//Cache是发生在cache1上的
public User find(Integer id) {
return null;
}
@Cacheable(cacheNames="user", key="#id")//使用方法参数中的id参数生成缓存键值对中的key
public User query(Integer id) {
return null;
}
key 自定义缓存的键,用来指定Spring缓存时对应的key的
@Cacheable(value="users", key="#user.id")
public User find(User user) {
return null;
}
2.@CacheEvict
2.1 概述:
本质是删除redis数据库的user命名空间下的所有键值对。原理很简单,仅仅是把缓存数据删除,无特别逻辑。若想删除redis缓存的所有用户数据,可以把注解改为
@CacheEvict(cacheNames="user", allEntries=true)
2.2.用法:
缓存被调用方法的结果(返回值),删除redis中对应的缓存。
@CacheEvict(cacheNames="user", key="#id")
@Override
public boolean delete(String id) {
// 可以在这里添加删除数据库对应用户数据的操作
return true;
}
3.@CachePut
3.1 概述:
@CachePut也可以声明一个方法支持缓存功能。不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
3.2 用法:
@Service
public class RedisOnlyServiceImpl implements UserService {
// 记录
private AtomicInteger executeCout = new AtomicInteger(0);
@CachePut(cacheNames="user", key="#user.id")
@Override
public User update(User user) {
// 每次方法执行executeCout
user.setUsername("redisOnly" + executeCout.incrementAndGet());
// 必须把更新后的用户数据返回,这样才能把它缓存到redis中
return user;
}
}