redis注解
value 有隔离作用,不行的话可以:
再手动用一下#root.caches,向spring表明,我们要用value所表示的缓存名来区分具体的缓存实体;
具体用法示例:
当方法的value属性进行了设置(如@Cacheable(value={"cache1", "cache2"})),则有两个cache;
此时可以使用@Cacheable(value={"cache1", "cache2"},key="#root.caches[0].name"),意思就是使用value为“cache1”的缓存;
@CacheEvict(value = "role1",allEntries = true)------整块全部删除
@CacheEvict(value = "role1",key = "#val",allEntries = false)-----指定key
@CachePut(value = "role1",key = "#val")---直接放入缓存块(追加,更新)
@Cacheable(value = "role1",key = "#val")---从缓存块获取,没有走方法
value==@CacheConfig(cacheNames="user")
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
@Cacheable 注解 源码如下 :
@Target({ElementType.METHOD, ElementType.TYPE})
value、cacheNames 属性 : 指定 Cache名称 表示当前方法的返回值是会被缓存在哪个 Cache上--块
key 属性 : 用来指定 Spring缓存方法的返回结果时对应的 key---在快上
@Cacheable(value = "users", key = "#id")
public User find(Integer id) {
return null;
}
@Cacheable(value = "users", key = "#p0")
public User find(Integer id) {
return null;
}
sync属性 : 在多线程环境下,某些操作可能使用相同参数同步调用。默认情况下,缓存不锁定任何资源,可能导致多次计算,而违反了缓存的目的。对于这些特定的情况,属性 sync 可以指示底层将缓存锁住,使只有一个线程可以进入计算,而其他线程堵塞,直到返回结果更新到缓存中
@Cacheable(cacheNames="foos", sync="true")----享元模式
public Foo executeExpensiveOperation(String id) {
}
condition属性 : 指定发生的条件,condition属性默认为空,表示将缓存所有的调用情形。其值是通过 SpringEL表达式来指定的,当为true时表示进行缓存处理;当为 false 时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次
@Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
@CachePut("users") 刷新缓存---用户可以操作不好指定到块(一个块多个key时)----追加???---追加、覆盖(更新)
https://blog.csdn.net/u013041642/article/details/80370156----------一般是多个方法操作一个缓存,来实现同步
@CacheEvict :
@CacheEvict(value="users", allEntries=true) --按照块清除,按照key清除(一个server一个块),可以用来整块清除---管理员接口
beforeInvocation属性 : 清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。--触发的时机
@Caching : @Caching注解可以在一个方法或者类上同时指定多 个Spring Cache 相关的注解。其拥有三个属性 : cacheable、put和evict,分别用于指定@Cacheable、@CachePut 和 @CacheEvict----三个元素可以放在一起使用,指明这个方法,触发哪些缓存操作
可以操作其他缓存
@Caching(cacheable = @Cacheable("users"),
evict = { @CacheEvict("cache2"),
@CacheEvict(value = "cache3", allEntries = true) })
public User find(Integer id) {
return null;
}
参考:
https://blog.csdn.net/chenshun123/article/details/79518812
https://q.cnblogs.com/q/111220/
https://blog.csdn.net/chenleixing/article/details/44815443
https://blog.csdn.net/weixin_34320724/article/details/86029310