Spring Cache + Redis实现数据缓存
Spring Cache
Spring Cache 是一个非常优秀的缓存组件。自Spring 3.1起,提供了类似于@Transactional注解事务的注解@Cache支持,且提供了Cache抽象,方便切换各种底层Cache。
优点:
提供基本的Cache抽象,方便切换各种底层Cache
通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到业务代码上,且只需要更少的代码就可以完成
提供事务回滚时也自动回滚缓存
支持比较复杂的缓存逻辑
Spring Cache的基本使用
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.10.0</version>
</dependency>
添加配置类
@EnableCaching:开启缓存,并配置Redis缓存管理器。@EnableCaching注解触发后置处理器, 检查每一个Spring bean的public方法是否存在缓存注解。如果找到这样的一个注释, 自动创建一个代理拦截方法调用和处理相应的缓存行为。
@Configuration
@EnableCaching
public class RedisConfig {
/**
* 自定义key规则
* 类名+方法名+参数
*/
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
/**
* 设置RedisTemplate规则
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会抛出异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//序列号key value
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* 设置CacheManager缓存规则
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题),过期时间600秒
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
}
}
添加Redis配置
redis:
host: 127.0.0.1
port: 6379
database: 0
timeout: 50000
lettuce:
pool:
max-active: 20
max-wait: -1
max-idle: 5
min-idle: 0
常用缓存标签
@Cacheable
对方法返回结果进行缓存。如果缓存不存在,则执行方法,并把返回的结果存入缓存中。如果缓存存在,则直接读取缓存数据返回。一般用在查询方法上。
@CachePut
使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。
@CacheEvict
使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上
使用Spring Cache
@RestController
public class TestController {
/**
* value:指定缓存存放在哪块命名空间
* keyGenerator: key的生成规则
*
* @return
*/
@GetMapping("/testCacheable")
@Cacheable(value = "cache", keyGenerator = "keyGenerator")
public String testCacheable() {
return "success";
}
/**
* 每次都会执行,并将结果存入指定的缓存中
*/
@GetMapping("/testCachePut")
@CachePut(value = "cache", keyGenerator = "keyGenerator")
public String testCachePut() {
return "success";
}
/**
* allEntries: 是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存
* beforeInvocation: 是否在方法执行前清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存
*/
@GetMapping("/testCacheEvict")
@CacheEvict(value = "cache", allEntries = true, beforeInvocation = false)
public String testCacheEvict() {
return "success";
}
}
执行测试
本机:0>keys *
1) "cache::cn.ybzy.demo.controller.TestControllertestCacheable"
本机:0>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/136951.html