# jcache-spring-boot-starter **Repository Path**: jhsy18702624734/jcache-spring-boot-starter ## Basic Information - **Project Name**: jcache-spring-boot-starter - **Description**: 这是一个基于原生spring cache组件改造的自定义缓存组件 重新封装了原生的缓存注解,更加符合业务开发的习惯。 只做了对原生功能拓展没有修改原有的功能,符合软件设计的开闭原则 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2022-08-04 - **Last Updated**: 2025-05-20 ## Categories & Tags **Categories**: spring-boot-ext, cache-modules **Tags**: Cache, Redis, Caffeine ## README ### **spring-boot-starter-jcache** #### 介绍 这是一个基于spring cache改造轻量级自定义缓存组件,只对原生`spring-cache`组件做了拓展,其中 $\color{#EE7600}{Redis}$ 只作为缓存场景,并不提供分布锁,延迟队列,工作队列等用途,没有其他奇技婬巧的东西。 - 这里是列表文本 大部分项目使用缓存的场景策略基本是复合的,也就是说有的可能只需要本地内存作为缓存,有的场景却需要使用到redis作为分布缓存 原生 $\color{#EE7600}{spring-boot-starter-cache}$ 策略一旦定下来,项目只能使用单一缓存方案,除非自己做了复合缓存拓展 - 注解上使用的不便之处,比如当你集成了 $\color{#EE7600}{Redis}$ 作为缓存的时候使用 $\color{#EE7600}{@Cacheable}$,$\color{#EE7600}{@CachePut}$ 注解的保存缓存时候 无法指定缓存的过期时间,并且使用缓存管理名称指定 $\color{#EE7600}{cacheManagers}$ 的时候不是很优雅。我想直接使用枚举指明我想要 $\color{#EE7600}{Redis}$ 还是 $\color{#EE7600}{Caffeine}$。`这里输入代码` 介绍一下提供的功能 - 目前集成了 $\color{#EE7600}{concurrentMapCacheManager}$ , $\color{#EE7600}{caffeineCacheManager}$ 本地内存管理 还有一个作为测试用途 $\color{#EE7600}{noOpCacheManager}$,一个 $\color{#EE7600}{redisCacheManager}$ 分布式缓存管理,$\color{#EE7600}{caffeineCacheManager}$ 和 $\color{#EE7600}{redisCacheManager}$是最有代表性的缓存,$\color{#EE7600}{Redis}$ 不过多介绍了,关于Caffine高速缓存可以看看他们的github地址: [https://github.com/ben-manes/caffeine](http://) - 除了原生的几个注解外,对于 $\color{#EE7600}{redisCacheManager}$ 提供了可以手动操作缓存的 Bean #### 软件架构 软件架构说明 1. 使用`Spring Boot 2.x` 版本 具体是 `2.6.3` 版本 但是2.x应该都能用,1.x版本可能会有不生效情况,具体没有测试过。 2. 原生的 `spring-boot-starter-cache`,`spring-boot-starter-redis` 3. `fastjson` 4. `apache-common` #### 安装教程 我没有发布到我的私仓,您可以发布到您自己的私仓 安装到本地仓库,作为测试使用: `mvn clean install` 发布到远程maven仓库,上线发布: 1. maven $\color{#EE7600}{setting.xml}$ 配置 私服的账号 ``` nexus-snapshots admin admin123 ``` 2.在该组件的 $\color{#EE7600}{pom}$ 文件中添加 ``` nexus-releases http://{您私服的地址}/repository/maven-releases/ ``` 3.执行命令 `mvn clean deploy` 4.需要引入组件的项目 $\color{#EE7600}{pom}$ 文件中引用 ``` org.madcat spring-boot-starter-jcache 1.0-RELEASE ``` #### 使用说明 1.启用 启动类上加 $\color{#EE7600}{@JEnableCaching}$ 注解,启用功能。$\color{red}{(注:假如你的配置文件中使用了spring.cache相关配置,那么会直接使用原生配置和功能,该组件所有拓展的功能都将不启用,也就是说原生的配置有更高的优先级)}$ 2.注解的使用 `@JCacheable(value = "jkdd:shop_auth", cacheType = CacheType.REDIS, key = "#shopId", expireTime = 3600, timeunit = TimeUnit.SECONDS)` - value/cacheNames: 当你的缓存为redis 这个值的意义就是redis key的分类,生成key的时候会加上这个前缀,当然你可以通过代码来配置不使用这个作为前缀,这里存在的意义就是将缓存按照业务分类。当你的缓存类型为caffeine时候 这个值就是你注入到容器里面的Caffeine Bean的名称。 - cacheType:代表缓存类型,比如这里代表的是使用redis作为缓存 - expireTime:redis 过期时间 - timeunit:过期时间的单位,默认为秒 - 其它的注解功能和原生的 `@Cacheable` 一致,具体参考spring cache的使用文档 - 其它注解 `@JCachePut`,`@JCacheEvict`,`@JCaching` 和 `@JCacheable` 一致 3.redis的配置 reids 依赖原生的redis 的配置 ConnectionFactory,这里省略连接池的配置,jedis.lettuce都是实现这个接口的 ``` spring.redis.database=1 spring.redis.host=127.0.0.1 spring.redis.password=123 spring.redis.port=6701 ``` 4.Caffine缓存注入的方式 - 实现 `JCaffeineCacheFactory `接口,参考 `NativeCaffeineCache` 这是一个没有任何策略的Caffine缓存 ``` @Component public class NativeCaffeineCache implements JCaffeineCacheFactory { @Override public String cacheName() { return "nativeCaffeineCache"; } @Override public Cache build() { return Caffeine.newBuilder().build(); } } ``` - 定义配置Caffine配置类 ``` @Configuration public class CaffeineConfig { @Bean("whiteListCaffeineCache") public JCaffeine whiteListCache() { Caffeine caffeine = Caffeine.newBuilder().recordStats().maximumSize(500).expireAfterAccess(1, TimeUnit.HOURS); return new JCaffeine<>("whiteListCaffeineCache", caffeine); } } ``` - 定义配置Caffine配置类使用SPEL 表达式构造bean ``` @Configuration public class CaffeineConfig { @Bean("whiteListCaffeineCache") public JCaffeineSpel whiteListCache() { return new JCaffeineSpel <>("whiteListCaffeineCache", "maximumSize=500,expireAfterAccess=1"); } } ``` $\color{red}{(注:使用注解时候你的注解vaule或者cacheManagers就得指定bean的名称,否则会自动创建一个原生的Caffine策略作为缓存策略,导致你达不到预期效果)}$ 5.手动操作redis缓存,注入实现bean ``` @Autowired private RedisCacheSupport redisCacheSupport ``` #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)