让程序员实现无感缓存
不再需要在业务上写各种代码
但是 springcache只支持 string 对于list set zset hash均不支持
基于注解实现缓存
Spring为我们提供了几个注解来支持Spring Cache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果,而使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素。下面我们将来详细介绍一下Spring基于注解对Cache的支持所提供的几个注解。
@Cacheable 查询
可以标记在一个方法上,也可以标记在一个类上。
当标记在一个方法上时表示该方法是支持缓存的,
当标记在一个类上时则表示该类所有的方法都是支持缓存的
对于一个支持缓存的方法,**Spring会在其被调用后将其返回值缓存起来**保证下次利用同样的参数来执行该方
法时可直接从缓存中获取结果,而**不需要再次执行该方法**
也就是说每次执行前会先去查询缓存中是否存在数据,不存在则去查询并将数据缓存
需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。@Cacheable可以指定三个属性
value、key和condition。
value属性指定Cache名称
@Cacheable(“cache1”)
@Cacheable("cache1")//Cache是发生在cache1上的
public User find(Integer id) {
returnnull;
}
@Cacheable({"cache1", "cache2"})//Cache是发生在cache1和cache2上的
public User find(Integer id) {
returnnull;
}
使用key属性自定义key
指定Spring缓存方法的返回结果时对应的key
可以直接使用“#参数名”或者“#p参数index”
@Cacheable(value="users", key="#id")
public User find(Integer id) {
return user;
}
@Cacheable(value="users", key="#p0")
public User find(Integer id) {
return user;
}
@Cacheable(value="users", key="#user.id")
public User find(User user) {
return user;
}
@Cacheable(value="users", key="#p0.id")
public User find(User user) {
return user;
}
condition属性指定发生的条件
有的时候我们可能并不希望缓存一个方法所有的返回结果
condition属性默认为空
@Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
public User find(User user) {
System.out.println("find user by user " + user);
return user;
}
@CachePut 修改
@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
更多的放在修改方法上
@CachePut("users")//每次都会执行方法,并将结果存入指定的缓存中
public User find(Integer id) {
return user;
}
@CacheEvict 删除
用来标注在需要清除缓存元素的方法或类上的
当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。