三.三 @CacheEvict 清空缓存
根据id 清空缓存 返回值可以是 void
@Override @CacheEvict(value = KEY_PRE,key = "#id") public void deleteUser(int id) { userMapper.deleteById(id); }
清空缓存
@Test public void deleteTest(){ userService.deleteUser(56); //id随时更换 }
发现数据库里面没有 id=56 的记录了, redis缓存里面也没有 key为 user_:: 56 的记录了。
findById 中 id=40 和 findAll() 生成两个缓存
删除时, 使用 allEntries=true 属性
@Override @CacheEvict(value = KEY_PRE,key = "#id",allEntries = true) public void deleteUser(int id) { userMapper.deleteById(id); }
运行删除 id=56(已经不存在这条记录信息了)
发现, 会清空当前数据库下所有的缓存信息。 所以,这个属性 allEntries 不要乱用。
三.四 @CacheConfig 在类上统一设置
我们发现, 我们设置缓存时, 每一个方法,无论是 findById , 还是 deleteUser, updateUser , 都使用了一个前缀 value=KEY_PRE, 这个值是 user_ 可不可以将这个前缀统一设置呢?
可以使用 @CacheConfig 注解在类上来简化缓存的开发.
@Service @Log4j2 @CacheConfig(cacheNames ={"user_"}) public class UserServiceImpl implements UserService { ... }
这样在 方法上,就可以省略掉 以前的 value 属性。
@Override @Cacheable(key="#id" ) public User findById(int id) { return userMapper.findById(id); } @Override @Cacheable(key = "#root.targetClass+#root.methodName") public List<User> findAll() { return userMapper.findAll(); } @Cacheable(key = "#root.targetClass+#root.methodName") @Override public List<User> findByNameAndSex(String name, String sex) { return userMapper.findByNameAndSex(name,sex); }
与以前是相同的效果。
可以一个实体类,设置一个相应的前缀信息。
三.五 @Caching 多注解组合
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Caching { Cacheable[] cacheable() default {}; CachePut[] put() default {}; CacheEvict[] evict() default {}; }
里面包含了三个常用的注解
@Caching( cacheable = { @Cacheable(key = "#name"), // 放置缓存到 name @Cacheable(key="#sex") // 放置缓存到 sex , id的缓存用 put更新 }, put = { @CachePut(key="#id") //同时更新 id缓存 } ) @Override public List<User> findByNameAndSexAndId(String name, String sex, Integer id) { return userMapper.findByNameAndSexAndId(name,sex,id); }
会同时将查询的信息 放置到 name 属性的缓存, sex属性的缓存里面, 同时更新 id属性的缓存信息。
测试类
@Test public void findNameAndSexAndIdTest(){ log.info(">>>>>>>>目前数据库中存在的用户信息:"); List<User> userList=userService.findByNameAndSexAndId("欢欢","女",40); userList.forEach(n->log.info(n)); }
查看缓存的信息
这些就是 Spring Cache 的基本用法.