赞
踩
Spring Cache是Spring框架提供的对缓存使用的抽象类,支持多种缓存,比如Redis、EHCache等,集成很方便。同时提供了多种注解来简化缓存的使用,可对方法进行缓存。
在pom.xml引入redis依赖:
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在application.yml配置文件配置redis:
spring:
redis:
database: 0
# Redis服务器地址
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
password:
jedis:
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
# 连接超时时间(毫秒)
timeout: 5000ms
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.interceptor.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import javax.annotation.Resource;
import java.time.Duration;
import static org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig;
/**
* @description:对spring的缓存进行配置
* @author:
* @create: 2019/12/10 下午 04:02
*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Resource
private RedisConnectionFactory redisConnectionFactory;
/**
* @description: 自定义生成redis-key
* @author:
* @date: 2019/12/12 下午 11:13
* @param
* @return org.springframework.cache.interceptor.KeyGenerator
*/
@Override
@Bean
public KeyGenerator keyGenerator() {
return (o, method, objects) -> {
StringBuilder sb = new StringBuilder();
sb.append(o.getClass().getName()).append(".");
sb.append(method.getName()).append(".");
for (Object obj : objects) {
sb.append(obj.toString());
}
System.out.println("keyGenerator=" + sb.toString());
return sb.toString();
};
}
/**
* @description: redis序列化方式
* @author:
* @date: 2019/12/12 下午 11:14
* @param
* @return org.springframework.data.redis.core.RedisTemplate<java.lang.Object,java.lang.Object>
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate() {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
redisTemplate.setKeySerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
return redisTemplate;
}
/**
* @description: 缓存解析器
* @author:
* @date: 2019/12/12 下午 11:17
* @param
* @return org.springframework.cache.interceptor.CacheResolver
*/
@Bean
@Override
public CacheResolver cacheResolver() {
return new SimpleCacheResolver(cacheManager());
}
/**
* @description: 用于捕获从Cache中进行CRUD时的异常的回调处理器
* @author:
* @date: 2019/12/12 下午 11:15
* @param
* @return org.springframework.cache.interceptor.CacheErrorHandler
*/
@Bean
@Override
public CacheErrorHandler errorHandler() {
return new SimpleCacheErrorHandler();
}
/**
* @description: 配置cacheManager
* @author:
* @date: 2019/12/12 下午 11:16
* @param
* @return org.springframework.cache.CacheManager
*/
@Bean
@Override
public CacheManager cacheManager() {
RedisCacheConfiguration cacheConfiguration = defaultCacheConfig()
/**
* 设置缓存有效期一小时
*/
.entryTtl(Duration.ofHours(1))
.disableCachingNullValues()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfiguration).build();
}
}
注意:网上很多教程使用的是下面这种以redisTemplate为参数的RedisCacheManager构造函数,但在springboot2.x中,RedisCacheManager已经没有了单参数的构造方法。
public CacheManager cacheManager(RedisTemplate<String,String> redisTemplate) {
RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
//使用前缀
rcm.setUsePrefix(true);
return rcm;
}
当上面的准备工作做好之后,就可以“高枕无忧”地使用Spring Cache注解
常用注解:
@Cacheable
:标记在一个方法上,也可以标记在一个类上。主要是缓存标注对象的返回结果,标注在方法上缓存该方法的返回值,标注在类上,缓存该类所有的方法返回值。
参数: value缓存名、 key缓存键值、 condition满足缓存条件、unless否决缓存条件
@CachePut
:方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
@CacheEvict
:从缓存中移除相应数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。