您觉得本文档还缺少什么内容?可以自己补充~

本模块将 分布式缓存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 : 分布式锁的简单实现

注意事项

  1. 本模块虽然实现了SpringCache管理器重写, 但不建议在项目中使用. (原因: this调用时, @Cache不生效)
  2. 通过bc.cache.cacheNullVal 全局配置是否缓存空值
  3. 通过bc.cache.serializerType 配置redis类型的缓存序列化的方式。 (注意,修改序列化类型后,需要先清空redis的所有缓存,并重启项目。 生产环境请勿轻易、经常切换序列化类型!)
bc:
  cache:
    type: REDIS
    cacheNullVal: true  #是否缓存空值
    serializerType:  ProtoStuff # 序列化类型 支持:JACK_SON、ProtoStuff、JDK
    # def:   # 不推荐使用。 用来配置Spring提供的@Cache的,自行阅读源码
    # configs:  # 不推荐使用。 用来配置Spring提供的@Cache的,自行阅读源码
  1. serializerType使用 JACK_SON 类型时,直接存储Long类型的值,从redis中取出数据时,需要手动强制转换成Long才行,否则会报错!!!

  2. bc-cloud 不能使用内存缓存,否则无法登录

如何新项目如何接入

1, 在pom.xml中加依赖

<dependency>
    <groupId>com.becypress.basic</groupId>
    <artifactId>bc-util-cache-starter</artifactId>
</dependency>
  1. 在 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}
  1. 为需要缓存的数据创建CacheKeyBuilder ,如 ApplicationCacheKeyBuilder
public class ApplicationCacheKeyBuilder implements CacheKeyBuilder {
    @Override
    public String getPrefix() {
        return CacheKeyDefinition.APPLICATION;   //key前缀
    }
    @Override
    public Duration getExpire() {
        return Duration.ofHours(24);  // 有效期
    }
}
  1. 需要操作缓存的地方注入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);
    }
}

results matching ""

    No results matching ""