前言:
日常开发中,一般设计时会把基础数据及业务数据隔离,在业务中会频繁使用基础数据;在不经常维护基础数据中有时大量的查询可能会导致接口效率降低,这时可采用比较常用的中间件,缓存可觉得此类问题;
一、构建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.properties
或application.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