SpringBoot 整合缓存思考历程记录
SpringBoot 整合缓存思考历程记录
本篇仅作思考过程记录,不详细涉及具体代码实现。
背景
- 中心存储是在关系型数据库
- 多个项目,一个项目管理数据,另一堆项目涉及高强度依赖于查询该数据
思考历程
- 确定一个中心的缓存存储,手写相关操作逻辑。需要权衡考量缓存、DB数据一致性问题
- 看下 cache2k 的文档,基于应用内存高性能缓存框架,各自从数据库加载还好说,就是多个应用间的缓存一致性需要手动处理。懒得编写代码就算了。
- 看下 Ehcache3 的文档,可以做配置集群,自动同步。但是需要基于 Terracotta 服务,所说这个搭建很简单。但是对于一个小系统来说能少点环境就少点。
- 确定基于 redis 做缓存,由于公司框架基于 Spring 体系,刚好有个
spring-data-redis
可以拿来用。然后心态爆炸,不知道公司框架魔改了哪里,引入spring-data-redis
后导致附属环境配置文件加载失败,具体表现在 application-dev.properties 文件内的配置全部没有读取到,只能读取到 application.properties 文件内的配置(浪费了半天时间确认是公司的框架导致的,还是没找到怎么改)。 - 发现
CacheManager
有个实现在Redisson
里面,已经引入了。去掉spring-data-redis
依赖,以Redisson
内的RedissonSpringCacheManager
作为Spring的缓存管理。
public class RedissonConfig {
private final CreatorProperties creatorProperties;
@Bean
RedissonClient redissonClient() {
CreatorProperties.Redis redisConfig = creatorProperties.getRedis();
String url = redisConfig.getUrl();
String password = redisConfig.getPassword();
String username = redisConfig.getUsername();
Config config = new Config();
SingleServerConfig singleServerConfig = config.useSingleServer();
// use "rediss://" for SSL connection
singleServerConfig.setAddress(url);
if (StringUtils.hasText(username)) {
singleServerConfig.setUsername(username);
}
if (StringUtils.hasText(password)) {
singleServerConfig.setPassword(password);
}
singleServerConfig.setDatabase(redisConfig.getDatabase());
log.debug("redis url: {}", url);
// 设置序列化方式为 JsonJacksonCodec 便于查找缓存
config.setCodec(new JsonJacksonCodec());
return Redisson.create(config);
}
@Bean
RedissonReactiveClient redissonReactive(RedissonClient redissonClient) {
return redissonClient.reactive();
}
@Bean
public CacheManager cacheManager(RedissonClient redissonClient) {
return new RedissonSpringCacheManager(redissonClient);
}
}