Spring caching使用及整合Redis

前言:

        日常开发中,一般设计时会把基础数据及业务数据隔离,在业务中会频繁使用基础数据;在不经常维护基础数据中有时大量的查询可能会导致接口效率降低,这时可采用比较常用的中间件,缓存可觉得此类问题;

一、构建springboot工程:

二、创建model、service等,模拟接口请求时间延迟3秒:

三、创建AppRunner实现CommandLineRunner进行测试;(CommandLineRunner是 Spring Boot 提供的一个接口,允许你定义在 Spring 应用程序启动后需要立即运行的代码。当你实现了这个接口,并提供了 run 方法的实现后,Spring Boot 会在所有 Spring Beans 都创建并初始化完成后自动调用这个 run 方法):

运行项目可以看到间隔的三秒输出:

四:添加注解@Cacheable(),在启动类中打开spring缓存@EnableCaching:

五、查看输出结果显示在第二次请求时直接从缓存中读取:

六、还有使用@CachePut注解,此注解用于在方法执行后更新缓存中的值,而无论该方法是否已经被缓存,与 @Cacheable 不同,@CachePut 总是会导致缓存的更新,即使方法的结果已经被缓存。(这里不建议两个注解同时使用在同一方法上,@CachePut 将会覆盖 @Cacheable 的行为,除非使用的属性key或者条件不一致);其他注解及注解的属性可参考spring官方文档:

Declarative Annotation-based Caching :: Spring Framework

七、在实际开发中一般引入第三方缓存,这里使用redis:安转并启动本地redis(有服务器的也可以在服务器中安装并启动redis):

八、项目中在application.propertiesapplication.yml配置文件中,你需要指定Redis服务器的地址、端口以及密码(如果有的话)。

spring.redis.host=127.0.0.1  
spring.redis.port=6379  
# spring.redis.password=yourpassword  
# 其他可能需要的配置,如数据库编号、连接池设置等

九、配置一个基于Redis的缓存管理器,使用Spring Boot框架中的RedisCacheManager和相关配置类,及在pom.xml中引入spring-boot-starter-data-redis:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
@Configuration
@EnableCaching
public class TestCacheManage {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager
                .RedisCacheManagerBuilder
                .fromConnectionFactory(redisConnectionFactory);

        // 设置缓存配置,例如默认过期时间、缓存键前缀等
        RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofHours(1)) // 设置缓存条目默认过期时间,防止缓存雪崩
                .disableCachingNullValues() // 不缓存空值,减少内存占用
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        builder.cacheDefaults(defaultCacheConfig);
        return builder.build();
    }
}

十:然后在重新启动项目可以看到缓存数据以存在你本地安装的redis中,使用RDM客户端可查看:

这里只是简单使用了项目中引入缓存的实例,实际开发中可自行配置一些缓存使用的规则,序列化配置及缓存异常处理等等,这里也使用了RedisTemplate:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // 设置序列化器
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(objectMapper);

        template.setValueSerializer(serializer);
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);

        return template;
    }
}

两则都可实现,就是序列化配置不太一致;

参考spring官方caching的使用:Getting Started | Caching Data with Spring

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值