您觉得本文档还缺少什么内容?可以自己补充~
本模块将 分布式缓存
和 redis
的一些基础共有方法抽象出来,达到平滑切换缓存的目的。业务系统使用时,注入 CacheOps 类即可。但这样做又有几个缺陷: redis 的一些特殊方法将无法使用 list、set、hash 高级功能, 古特意新增人一个CacheOpsPlus 类支持redis全部接口。
使用bc-util-cache-starter后想用redis的 特殊方法 怎么用?
配置文件配置bc.cache.type=redis后,注入CacheOpsPlus即可, 只要你能保证系统必须依赖redis即可。 但CacheOpsPlus基于内存等实现不能保证代码的正确性!!!
为啥要在封装一次?
1, 项目比较小(基本都是CRUD功能),而且团队中会优雅使用redis的比较少,而且会频繁的复制代码到N个项目,每个项目随时都可能会重新部署或者迁移一套环境用于演示, 这里就是想让一些部署去演示的项目,直接用内存缓存即可,少部署一个redis。 2, 开发电脑配置比较低,启动太多中间件会很卡,对于专心编码的开发来说,少启动一个中间件,对开发的体验比较好
本模块核心API
- CacheOps : 基础缓存操作类
- CachePlusOps : 增强缓存操作类, 包含了redis常用的方法
- CacheKey (为了解耦, 已经移动到你bc-util-core模块下) : 封装了缓存key 和 过期时间的 缓存Key对象
- RedisDistributedLock : 分布式锁的简单实现
注意事项
- 本模块虽然实现了SpringCache管理器重写, 但不建议在项目中使用. (原因: this调用时, @Cache不生效)
- 通过
bc.cache.cacheNullVal
全局配置是否缓存空值 - 通过
bc.cache.serializerType
配置redis类型的缓存序列化的方式。 (注意,修改序列化类型后,需要先清空redis的所有缓存,并重启项目。 生产环境请勿轻易、经常切换序列化类型!)
bc:
cache:
type: REDIS
cacheNullVal: true #是否缓存空值
serializerType: ProtoStuff # 序列化类型 支持:JACK_SON、ProtoStuff、JDK
# def: # 不推荐使用。 用来配置Spring提供的@Cache的,自行阅读源码
# configs: # 不推荐使用。 用来配置Spring提供的@Cache的,自行阅读源码
serializerType使用 JACK_SON 类型时,直接存储Long类型的值,从redis中取出数据时,需要手动强制转换成Long才行,否则会报错!!!
bc-cloud 不能使用内存缓存,否则无法登录
如何新项目如何接入
1, 在pom.xml中加依赖
<dependency>
<groupId>com.becypress.basic</groupId>
<artifactId>bc-util-cache-starter</artifactId>
</dependency>
- 在 redis.yml 中加入配置
bc:
redis:
ip: 127.0.0.1
port: 6379
password: '' # 空秘密必须用空字符串表示
database: 0
cache:
type: REDIS # CAFFEINE
cacheNullVal: true # 是否缓存null值
serializerType: ProtoStuff # 序列化类型 支持:JACK_SON、ProtoStuff、JDK
spring:
redis:
host: ${bc.redis.ip}
password: ${bc.redis.password}
port: ${bc.redis.port}
database: ${bc.redis.database}
- 为需要缓存的数据创建CacheKeyBuilder ,如
ApplicationCacheKeyBuilder
public class ApplicationCacheKeyBuilder implements CacheKeyBuilder {
@Override
public String getPrefix() {
return CacheKeyDefinition.APPLICATION; //key前缀
}
@Override
public Duration getExpire() {
return Duration.ofHours(24); // 有效期
}
}
- 需要操作缓存的地方注入CacheOps
@Autowired // 普通缓存功能
private CacheOps cacheOps;
@Autowired // 增强功能
private CachePlusOps cachePlusOps;
public void teset(){
CacheKey cacheKey = new VerificationCodeCacheKeyBuilder().key(data.getType().name(), data.getMobile());
cacheOps.set(cacheKey, code);
}
原理
为什么在pom中引入依赖 bc-util-cache-starter
后,在项目中就能注入使用了?
@Autowired
private CacheOps cacheOps;
@Autowired
private CacheOpsPlus cacheOpsPlus;
1, bc-util-cache-starter/src/main/resources/META-INF/spring.factories
中有如下配置,该配置会在项目启动时,自动加载 CacheAutoConfigure 类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
top.tangyh.basic.cache.CacheAutoConfigure
2, 这个类通过注解启用了缓存, 并导入Redis 自动配置类
@EnableCaching
@Import({
RedisAutoConfigure.class
})
public class CacheAutoConfigure {
//省略...
}
3,RedisAutoConfigure 在bc.cache.type=REDIS时生效,bc.cache.type没有配置时,默认使用redis的配置,RedisAutoConfigure内部实例化了RedisOpsImpl。
所以,在项目中注入CacheOps 或者 CacheOpsPlus 即可。
@ConditionalOnClass(RedisConnectionFactory.class)
@ConditionalOnProperty(name = "bc.cache.type", havingValue = "REDIS", matchIfMissing = true)
@EnableConfigurationProperties({RedisProperties.class, CustomCacheProperties.class})
public class RedisAutoConfigure {
@Bean
@ConditionalOnMissingBean
public CacheOps cacheOps(RedisOps redisOps) {
return new RedisOpsImpl(redisOps);
}
@Bean
@ConditionalOnMissingBean
public CachePlusOps cachePlusOps(RedisOps redisOps) {
return new RedisOpsImpl(redisOps);
}
}