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进行序列化与反序列化

### spring-boot-starter-data-redisspring-boot-starter-cache 的区别及应用场景 #### 区别 `spring-boot-starter-data-Redis` 主要用于与 Redis 数据库交互,提供了一套完整的操 Redis 的 API 支持[^1]。它不仅限于缓存场景,还可以为消息队列、发布/订阅模式等多种用途的数据存储解决方案。 而 `spring-boot-starter-cache` 则专注于实现应用级别的缓存抽象层,旨在简化开发者在项目中加入缓存机制的过程[^2]。此模块并不直接关联任何特定类型的持久化技术;相反,它是通过 SPI (Service Provider Interface) 来支持多种不同的缓存提供商,比如 EhCache, Caffeine 或者 Redis 等。 因此,在引入 `spring-boot-starter-cache` 后还需要额外指定具体的缓存实现方式——如果选择了 Redis,则通常会配合使用 `spring-boot-starter-data-redis` 提供的支持来完成实际的操逻辑[^4]。 #### 应用场景 对于希望利用 Redis 进行复杂数据结构管理和分布式环境下的高性能读写需求的应用来说,应该优先考虑采用 `spring-boot-starter-data-redis` 。这使得开发人员能够充分利用 Redis 所提供的诸如列表(lists),集合(sets), 排序集(sorted sets)等功能特性[^3]。 另一方面,当只需要简单地提升热点查询效率或是减少数据库负载压力时,可以选择仅使用 `spring-boot-starter-cache` 并搭配合适的本地或远程缓存方案即可满足业务要求。这种方式下,即使不涉及复杂的键值对操也能有效改善系统的响应时间和吞吐量表现。 ```java // 使用 spring-boot-starter-data-redis 实现简单的字符串设置和获取 @Autowired private StringRedisTemplate stringRedisTemplate; public void setKeyValue(String key, String value){ stringRedisTemplate.opsForValue().set(key,value); } public String getValueByKey(String key){ return stringRedisTemplate.opsForValue().get(key); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值