一、starter引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
二、配置application.properties相关属性
spring.cache.type=redis
spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
# 是否缓存空值
spring.cache.redis.cache-null-values=true
三、redis配置
1、添加@EnableCaching注解
2、配置RedisTemplate
3、配置缓存管理器CacheManager
@Configuration
@EnableCaching
public class RedisConfig {
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private int port;
@Bean
public JedisConnectionFactory redisConnectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName(host);
factory.setPort(port);
return factory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
// 设置序列化器
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(objectMapper, Object.class);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* 配置并创建Redis CacheManager
* 该方法通过RedisConnectionFactory来构建一个RedisCacheManager实例,并配置缓存的默认过期时间和序列化方式
*
* @param factory Redis连接工厂,用于建立与Redis服务器的连接
* @return CacheManager实例,用于管理缓存
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
ObjectMapper objectMapper = new ObjectMapper();
// 设置对象所有属性的可见性,使得它们都可以被序列化和反序列化
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 以下行代码已注释掉,作用是启用默认类型检测,但这里选择了更灵活的配置方式
// objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
// 激活默认类型检测,但只针对非final类型,这提高了类型处理的灵活性和安全性
objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
Jackson2JsonRedisSerializer<Object> jacksonSerializer = new Jackson2JsonRedisSerializer<>(objectMapper, Object.class);
// 配置缓存的默认属性
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10)) // 设置缓存项的过期时间,默认为10分钟
.disableCachingNullValues() // 禁止缓存Null值,避免不必要的内存占用
// 设置键序列化器为StringRedisSerializer,以便将键以字符串形式存储和读取
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(
new StringRedisSerializer()))
// 设置值序列化器为StringRedisSerializer,以便将值以字符串形式存储和读取
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(
jacksonSerializer));
// 构建RedisCacheManager实例,使用上述配置
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
}
@Bean
public RedisCacheConfiguration cacheConfiguration() {
return RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
}
}
四、在Service层需要缓存的信息接口添加@Cacheable
@Cacheable(value = "staff", key = "'staff:' + #id", cacheManager = "cacheManager")
public Staff selectUserById(Integer id) {
log.info("查询用户信息");
Staff staff = userMapper.selectUserById(id);
log.info("查询用户信息结束");
return staff;
}
524

被折叠的 条评论
为什么被折叠?



