Redis注解开发流程

注解提供了更声明式和方便的方式,而编码方式允许更精细的控制和定制。
在Java中,当Redis充当缓存时,使用注解的方式更为常见和方便。Spring Framework提供了一种基于
注解的缓存机制,称为Spring Cache。通过在方法上添加注解,开发人员可以指定缓存的行为,例如缓
存的名称、缓存的过期时间等。使用注解的方式,开发人员可以在代码中更直观地定义缓存逻辑,而无
需手动编写缓存代码。
Spring Cache提供了多个注解,最常用的是@Cacheable、@CachePut和@CacheEvict 。
@Cacheable 用于标记方法应该被缓存
@CachePut 用于将方法的结果存储到缓存中
@CacheEvict 用于从缓存中删除数据
 
1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、添加配置 application.properties
     
spring.redis.host=localhost
spring.redis.port=6379
spring.cache.type=redis
3、定义配置类
@EnableCaching
@SpringBootConfiguration
public class MyRedisConfig {
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory factory) {
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer =
new GenericJackson2JsonRedisSerializer();
StringRedisSerializer stringRedisSerializer = new
StringRedisSerializer();
RedisCacheConfiguration config =
RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(100))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(st
ringRedisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(
genericJackson2JsonRedisSerializer));
return RedisCacheManager.builder(factory)
.cacheDefaults(config).build();
}
}
4、在方法上添加对应的注解,就可以达到缓存的目的
@Service
public class UserServImpl implements IUserServ{
@Cacheable(value = "users",key = "#id") 设置所使用的key值为users::传入的参数id值
public User load(Long id) {
System.out.println("执行业务逻辑");
User user=new User();
user.setId(99L);
user.setUsername("zhangsan");
user.setPassword("123456");
return user;
}
}
 
注解Cacheable
@Cacheable注解主要针对方法配置,能够根据方法的请求参数和运行结果进行缓存,比如如果缓存中
存在该值,则使用缓存数据, 如果不在缓存中,则执行业务逻辑处理,并将执行结果存入缓存
value/cacheNames:指定缓存空间的名称,比配属性。可二选一使用。
key:指定缓存中数据的key,默认使用方法参数值,也可使用SpEL表达式
keyGenerator:指定缓存数据的key的生成器,与key属性二选一使用
cacheManager:指定缓存的管理器
cacheResolver:指定缓存的解析器,与cacheManager属性二选一使用
condition:指定在符合某种条件下,进行数据缓存,不符合条件则不执行存储
unless:指定在符合某种条件下不进行数据缓存
sync:指定是否使用异步缓存,默认为false
@CacheAable(value="dep",key="#department.id") //缓存所使用的key值由value和key共同组
成,值为dept::再加上参数department对象中的id参数值
public Department listDepartment(Department department){
System.out.println("加载信息:"+department);
departmentDao.loadDepartment(department);
return department;
}
如果方法的返回值为空时不执行缓存,则可以引入condition和unless设置缓存规则 @Cacheable(value
= "users",key = "#id",condition = "#result!=null") ,这里出现问题,解决方案使用
@Cacheable(value = "users",key = "#id",unless="#result == null")
condition对入参进行判断,符合条件的放入缓存,不符合的不缓存,condition能使用的只有
#root和参数,不能使用返回结果
unless是对出参进行判断,符合条件的不缓存,不符合的放入缓存,而unless是可以使用#result的
 
注解EnableCaching
@EnableCaching主要用于开启基于注解的缓存支持,用在应用主类或者配置类上
@EnableCaching
@SpringBootConfiguration
public class MyRedisConfig {

 

注解CacheConfig
@CacheConfig注解是加在类上,用于抽取缓存的公共配置。
在类头上加了@CacheConfig注解等同于每个方法上的缓存注解都加了cacheName或者value指定的组
件,并且这个组件来自@CacheConfig,也就是用于统筹管理类中所有使用@Cacheable、@CachePut…
和@CacheEvict 注解标注方法中的公共属性,这些公共属性包括有cacheNames、keyGenerator 、
cacheManager和cacheResolver
@CacheConfig(cacheNames = "users") 等价于在每个缓存注解上添加了value="users"
@Service
public class UserServImpl implements IUserServ{
@Cacheable(value="bbb",key = "#id",unless="#result == null") 在类上有定义,同时
在方法上也有定义,则局部优先
public User load(Long id) {

 

注解CachePut
@CachePut该注解用于设置缓存。表示在调用方法的同时又更新缓存,它是默认先调用目标方法,然后
将目标方法的运行结果存入缓存,不过需要注意的是如果要保持缓存同步更新,这个注解使用的key需要
和缓存的key保持一致。
和@cacheable不同的是:
@Cacheable在运行在目标方法之前,而它是目标方法之后,因为它需要先拿到目标方法运
行的结果
@Cacheable不可以使用#result,因为使用@Cacheable标注的方法不一定会被调用,可能
获取不到result。
属性和@cacheable基本一致,就少了一个是否异步(sync)的属性
 
注解CacheEvict
@CacheEvict 该注解用于清理缓存。先进行方法调用,然后将缓存进行清除。例如
@CacheEvict(value=”users”,key=”#user.getName()”),其中的 Key 是用来指定缓存的 key 的
allEntries属性: 表示是否清除指定缓存中的所有键值对,既是否清除所有缓存,设置为true时会
清除缓存中的所有键值对,默认为false,即根据key清除缓存。所以它与key属性二选一使用
beforeInvocation属性: 表示是否是在@CacheEvict注解的方法调用之前清除指定缓存,默认为
false,即在方法调用之后清除缓存,设置为true时则会在方法调用之前清除缓存。在方法调用之前
还是之后清除缓存的区别在于方法调用时是否会出现异常,若不出现异常,这两种设置没有区别,
若出现异常,设置为在方法调用之后清除缓存将不起作用,因为方法调用失败了。
 
 
注解Caching
@Caching该注解可以对缓存清理、设置 操作打包。用于针对复杂规则的数据缓存管理,可以作用于类
或方法,在@Caching注解内部包含有Cacheable、put和evict三个属性,分别对应于@Cacheable、
@CachePut和@CacheEvict三个注解
@Caching(
cacheable={@Cacheable(cacheNames ="comment",key = "#id")},
put = {@CachePut(cacheNames = "comment",key.= "#result.author")}
)
public Comment getcoiment(int id){
return commentRepository.findByld(id).get();
}

 

posted @ 2023-08-02 19:33  躺平小伙  阅读(46)  评论(0编辑  收藏  举报