Redis 注解相关
前言
Spring Cache使用方法与Spring对事务管理的配置相似。SpringCache的核心就是对某个方法进行缓存,其实质就是缓存该方法的返回结果,并把方法参数和结果用键值对的方式存放到缓存中,当再次调用该方法使用相应的参数时,就会直接从缓存里面取出指定的结果进行返回。
常用注解
1、@EnableCaching:开启缓存支持
2、@Cacheable:使用这个注解的方法在执行后会缓存其返回结果(存储数据到缓存)
3、@CacheEvict:使用这个注解的方法在其执行前或执行后移除Spring Cache中的某些元素(删除缓存)
缓存使用
导入依赖
pom.xml
<!--redis 配置--> |
application.yml
spring: |
注解
@Cacheable
读取缓存数据,无数据则会更新缓存中数据。配置在方法或类上。
作用:本方法执行后,先去缓存看有没有数据,如果没有,从数据库中查找出来,给缓存中存一份,返回结果会将方法的返回值作为value进行缓存,下次本方法执行,在缓存未过期情况下,先在缓存中查找,有的话直接返回,没有的话从数据库查找。
注解参数:
| 参数 | 类型 | 解释 | 样例 |
|---|---|---|---|
| value | String[] | 缓存位置名称(可以认为其为组的概念) | @Cacheable(value = "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null") |
| cacheNames | String[] | 同上方value同理(具体使用请参考@CacheConfig) | @Cacheable(cacheNames= "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null") |
| key | String | 缓存键,可使用“:”分割,分割后为组的概念,#后为方法上的参数名称,如果参数为对象,则#对象.get对应的属性值 | 名称,如果参数为对象,则#对象.get对应的属性值@Cacheable(value = "CREATE_NUMBER_RECORDING", key = "#infoDate+':'+#companyId+':'+#type+':'+#param1") |
| keyGenerator | String | 自定义生成key方式,与key()不可以共用。其值为spring注入的类,其类实现implements KeyGenerator 接口 | @Cacheable(cacheNames = "ids_cache",keyGenerator = "setKeyGrenerator") |
| cacheManager | String | ||
| cacheResolver | String | ||
| condition | String | 使用SpEL表达式设定出发缓存的条件,在方法执行前生效 | |
| unless | String | 使用SpEL设置出发缓存的条件,方法执行完生效,所以条件中可以有方法执行后的value。函数返回值符合条件的排除掉、只缓存其余不符合条件的 | @Cacheable(unless="#result == null") 排除值为null 的情况 |
| sync | boolean | 是否同步,默认false |
@CachePut
更新缓存中的值。配置到方法上。
作用:类似于更新操作,即每次不管缓存中有没有结果,都从数据库查找结果,并将结果更新到缓存,并返回结果。
注解参数:
| 参数 | 类型 | 解释 | 样例 |
|---|---|---|---|
| value | String[] | 缓存位置名称(可以认为其为组的概念) | @CachePut(value = "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null") |
| cacheNames | String[] | 同上方value同理(具体使用请参考@CacheConfig) | @CachePut(cacheNames= "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null") |
| key | String | 缓存键,可使用“:”分割,分割后为组的概念,#后为方法上的参数名称,如果参数为对象,则#对象.get对应的属性值 | 名称,如果参数为对象,则#对象.get对应的属性值@CachePut(value = "CREATE_NUMBER_RECORDING", key = "#infoDate+':'+#companyId+':'+#type+':'+#param1") |
| keyGenerator | String | 自定义生成key方式,与key()不可以共用。其值为spring注入的类,其类实现implements KeyGenerator 接口 | @CachePut(cacheNames = "ids_cache",keyGenerator = "setKeyGrenerator") |
| cacheManager | String | ||
| cacheResolver | String | ||
| condition | String | 使用SpEL表达式设定出发缓存的条件,在方法执行前生效 | |
| unless | String | 使用SpEL设置出发缓存的条件,方法执行完生效,所以条件中可以有方法执行后的value。函数返回值符合条件的排除掉、只缓存其余不符合条件的 | @CachePut(unless="#result == null") 排除值为null 的情况 |
@CacheEvict
删除缓存数据,配置到方法上。
作用:用来清除用在本方法或者类上的缓存数据。
注解参数:
| 参数 | 类型 | 解释 | 样例 |
|---|---|---|---|
| value | String[] | 缓存位置名称(可以认为其为组的概念) | @CacheEvict(value = "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null") |
| cacheNames | String[] | 同上方value同理(具体使用请参考@CacheConfig) | @CacheEvict(cacheNames= "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null") |
| key | String | 缓存键,可使用“:”分割,分割后为组的概念,#后为方法上的参数名称,如果参数为对象,则#对象.get对应的属性值 | 名称,如果参数为对象,则#对象.get对应的属性值@CacheEvict(value = "CREATE_NUMBER_RECORDING", key = "#infoDate+':'+#companyId+':'+#type+':'+#param1") |
| keyGenerator | String | 自定义生成key方式,与key()不可以共用。其值为spring注入的类,其类实现implements KeyGenerator 接口 | @CacheEvict(cacheNames = "ids_cache",keyGenerator = "setKeyGrenerator") |
| cacheManager | String | ||
| cacheResolver | String | ||
| condition | String | 使用SpEL表达式设定出发缓存的条件,在方法执行前生效 | |
| allEntries | boolean | allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。 | |
| beforeInvocation | boolean | 清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。 |
@Caching
同时指定多个Spring Cache相关的注解,配置到方法或者类上。
其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。
注解参数:
| 参数 | 类型 | 解释 | 样例 |
|---|---|---|---|
| cacheable | Cacheable[] | 配置多个@Cacheable | @CacheEvict(value = "CREATE_NUMBER_RECORDING", key = "#infoDate",unless="#result == null") |
| put | CachePut[] | 配置多个CachePut | |
| evict | CacheEvict[] | 配置多个CacheEvict |
缓存使用示例
Application启动类
在启动类上添加注解 @EnableCaching 开启缓存支持
|
实现类中具体代码
@CacheConfig
场景:在方法前添加 @CacheConfig 注解可以指定整个类中的 RedisCache 缓存的名称(也就是前缀)
注意:cacheNames 等同于 value
|
@Cacheable
场景:查询操作时,添加数据到缓存中
注意:若此处的类上使用了 @CacheConfig 注解设置了 cacheNames 或 value的值,则存入缓存的 key 为 “user:id”
|
@CacheEvict
场景:在执行根据id删除操作时,删除全部key为”user:id”的缓存
|
@CachePut
场景:在进行保存操作时,无论缓存中是否有相同key的数据,都会直接保存缓存
注意:在正常业务中保存操作会直接返回一个 boolean 值的结果,但是在执行保存缓存操作时,如果直接返回一个 boolean 值的结果会导致数据存储丢失,需要返回一个 user 的对象才是把整个保存的 user 对象进行存储
|
结语
在学习过程中还有看到自定义注解的使用,暂未搞懂,故不做记录。
