redis缓存-注解-CacheConfig-Caching-CachePut-CacheEvict

    技术2022-07-11  122

    @CacheConfig(cacheNames = {"cache-Cacheconfig"}) //设置全局缓存名称。 public class cacheConfigServiceImpl implements cacheConfigService { /** * @CachePut: 这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中,实现缓存与数据库的同步更新。 * @Cacheable(value=”accountCache”),这个注释的意思是,当调用这个方法的时候,会从一个名叫 accountCache 的缓存中查询,如果没有,则执行实际的方法(即查询数据库),并将执行的结果存入缓存中,否则返回缓存中的对象 * @CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空 * * @Cacheable(key = "#str",condition="#str.length()>2") * condition,相当于条件判断是否,需要加入缓存· * * @Caching(put = { * @CachePut(value = "user", key = "#user.id"), * @CachePut(value = "user", key = "#user.username"), * @CachePut(value = "user", key = "#user.email") * }) * 有时候我们可能组合多个Cache注解使用;比如用户新增成功后,我们要添加id–>user;username—>user;email—>user的缓存;此时就需要@Caching组合多个注解标签了 * * @Cacheable(key = "#str",condition="#str.length()>2") 因为这个注解在进入方法前去检测condition condition = "#result != null" , 而这时还没有result,会造成result为null的情况。 * * allEntries=true,清除该当前value值空间下的所有缓存数据 * * beforeInvocation = true 先执行缓存,在执行方法 * @param str * @return */ @Cacheable(key = "#str",condition="#str.length()>2") //设置缓存 key值 @Override public String test1Config(String str) { return str; } @CacheEvict(key = "#str", beforeInvocation = true) //通过key 移除redis缓存 , beforeInvocation = true, 执行方法前执行缓存。 但是:默认在当前注解方法成功执行之后再清除。 @Override public String test2Config(String str) { return str; } /** * unless的作用时机: 目标方法运行后 * 注: 如果(因为直接从缓存中获取到了数据,而导致)目标方法没有被执行,那么unless字段不生效 * * unless的功能: 是否 令注解(在方法执行后的功能)不生效; * 注:unless的结果为true,则(方法执行后的功能)不生效; * unless的结果为false,则(方法执行后的)功能生效. * * 举例说明一: 对于@Cacheable注解,在执行目标方法前,如果从缓存中查询到了数据,那么直接返回缓存中的数据; * 如果从 缓存中没有查询到数据,那么执行目标方法,目标方法执行完毕之后,判断unless的结果, * 若unless的结果为true,那么不缓存方法的返回值; * 若unless的结果为false,那么缓存方法的返回值。 * * 举例说明二: 对于@CachePut注解,在目标方法执行完毕之后,判断unless的结果, * 若unless的结果为true,那么不缓存方法的返回值; * 若unless的结果为false,那么缓存方法的返回值。 * * 注:unless默认为"",即相当于默认为false. * * 注:因为unless的作用时机是在方法运行完毕后,所以我们可以用SpEL表达式 #result 来获取方法的返回值 */ @CachePut( key = "#i + '*****' ", unless = "#result < 5000") @Override public Integer test3Config(Integer i) { return i; } /** * #a0+1 ,,,如果传的参数是 1开始, 那么加一就是从2开始 *例如:传参数是 1,2,3,4,5,6,7,8,9 那么参数级别加起来是 2,3,4,5,6,7,8,9,10 * #a0 代表第一个参数 * * @param i * @return */ @CacheUser.UserSaveCache2 @Override public Integer test4Config(int i) { return null; } /** * * 多命名空间,,当进行缓存读取时,,会按照命名空间的顺讯,挨个从命名空间中查询对应的key, * 如果在某个命名空间找到缓存,就不会查询排在后面的命名空间,也不对执行对应的方法 * @param str * @return */ @Cacheable(cacheNames = {"TestConditionSpaceB", "TestConditionSpaceA"}, key = "'abcd'+#str") @Override public String test5Config(String str) { System.out.println("说明(指定cacheNames下存在对应key的缓存)为false!"); return str; }

     

    Processed: 0.014, SQL: 10