在平时使用Redis作为API接口查询缓存的时候 通常都是使用RedisTemplate来写一堆逻辑处理缓存数据 但是作为一个“懒人”的我为了更好的偷懒会研究一些更方便的处理方式。

MySQL+Redis使用更简单的办法就是使用Spring的Cache注解包(spring-boot-starter-cache) 只需要几个注解就能完成一大堆要处理的逻辑

使用时需要在启动类上添加注解 @EnableCaching 来开启使用

@Cacheable
@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略,这个稍后会进行说明。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的

@CachePut
在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

@CacheEvict
@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。

@Caching
@Caching注解可以让我们在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。

@CacheConfig
所有的@Cacheable里面都有一个value=“xxx”的属性,这显然如果方法多了,写起来也是挺累的,使用@CacheConfig(cacheNames = “User:Info”)可以一次性声明

注意:缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合

下面上个使用示例

@Service
//这里的CacheConfig用来统一配置一下缓存的名字前缀 本示例中在Redis里面的key会像User:Info::xxxxxx 这样
@CacheConfig(cacheNames = "User:Info")
public class UserServiceImpl implements UserService {

   //这里的Cacheable用来获取缓存信息 会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法中查询逻辑
    @Cacheable(key = "#fromUin", unless = "#result == null")
    public UserEntity getUserInfo(String fromUin) {
        return Objects.requireNonNull(userRepository.findById(fromUin).orElse(null), "用户不存在");
    }

	//这里的CachePut用来在修改个人信息时更新缓存的用户信息
    @CachePut(key = "#userEntity.fromUin")
    public UserEntity serUserInfo(UserEntity userEntity){
		//.....
	}

	//这里的CacheEvict是用来删除缓存的用户信息 免得没用的数据占用Redis存储空间
	@CacheEvict(key = "#userEntity.fromUin")
    public UserEntity deleteUserInfo(UserEntity userEntity){
		//.....
	}
}

如上面示例 就完成了数据结果缓存 减少的数据库的查询 代码简洁方便 不用手动撸一大堆判断咯 其他的细节信息可以查阅官方文档 这里懒得写咯。

记得使用时需要在启动类上添加注解 @EnableCaching 来开启使用