Springboot集成Redis使用spring-boot-starter-cache作声明式缓存

一、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;
    }

Tip:针对枚举序列化问题

参照这篇博文:枚举类使用Jackson进行序列化与反序列化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值