注解提供了更声明式和方便的方式,而编码方式允许更精细的控制和定制。
在Java中,当Redis充当缓存时,使用注解的方式更为常见和方便。Spring Framework提供了一种基于注解的缓存机制,称为Spring Cache。通过在方法上添加注解,开发人员可以指定缓存的行为,例如缓存的名称、缓存的过期时间等。使用注解的方式,开发人员可以在代码中更直观地定义缓存逻辑,而无需手动编写缓存代码。
Spring Cache提供了多个注解,最常用的是
org.springframework.boot
spring-boot-starter-cache
org.springframework.boot
spring-boot-starter-data-redis
spring.redis.host=localhost
spring.redis.port=6379
spring.cache.type=redis
@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();
}
}
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注解主要针对方法配置,能够根据方法的请求参数和运行结果进行缓存,比如如果缓存中存在该值,则使用缓存数据, 如果不在缓存中,则执行业务逻辑处理,并将执行结果存入缓存
@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”)
@EnableCaching主要用于开启基于注解的缓存支持,用在应用主类或者配置类上
@EnableCaching主要用于开启基于注解的缓存支持,用在应用主类或者配置类上
@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该注解用于设置缓存。表示在调用方法的同时又更新缓存,它是默认先调用目标方法,然后将目标方法的运行结果存入缓存,不过需要注意的是如果要保持缓存同步更新,这个注解使用的key需要和缓存的key保持一致。
和@cacheable不同的是:
@Cacheable在运行在目标方法之前,而它是目标方法之后,因为它需要先拿到目标方法运
行的结果
@Cacheable不可以使用#result,因为使用@Cacheable标注的方法不一定会被调用,可能
获取不到result。
属性和@cacheable基本一致,就少了一个是否异步(sync)的属性
@CacheEvict 该注解用于清理缓存。先进行方法调用,然后将缓存进行清除。例如
@CacheEvict(value=”users”,key=”#user.getName()”),其中的 Key 是用来指定缓存的 key 的
@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();
}
这就是注解开发中需要用到基本的的依赖,配置,以及常用的注解,我们在开发过程中更多的使用还是注解的方式,如果想使用其他方式,可以参考我的上一篇博文