u2Cache 基于内存和Redis的两层自助式缓存框架
介绍
基于spring boot的两级缓存框架。支持本地与远程缓存的自助式组装。一级缓存为Caffeine,二级缓存为Redis。缓存策略支持一级缓存、二级缓存和两级并存模式。 主要解决几种场景问题:
1、本地缓存速度快,但容纳空间小,无法让所有数据均存储于此
2、大量的缓存读取会导致二级缓存网络拥堵,流量阻塞,从而造成性能瓶颈;而一级缓存则可以降低对二级缓存的访问频率,从而提升读取效率
3、缓存适用于单机、集群等环境,对于单机环境仅使用以及缓存即可;对于集群环境则可以两者并用,从而降低服务宕机所造成的瞬时大并发量数据问题
4、解决基于目前spring boot注解式缓存无法解决单key过期时间问题
5、支持事件驱动机制,便于服务多层缓存嵌套下,无法清空更新的问题
6、支持缓存预热,启动时加载必要缓存信息,并进行预热处理
7、支持缓存续命,允许缓存根据key,定时自动续命,防止失效
框架说明
是基于注解式的两级缓存框架,通过注解实现声明式的方法缓存。分为两级缓存:一级缓存使用本地缓存(目前只支持Caffeine,后续可扩展),二级缓存使用集中式缓存(目前只支持Redis)。目前支持三种缓存策略:
1、只使用一级缓存
2、只使用二级缓存
3、同时使用两级缓存
特性说明
1、支持基于注解直接配置
2、支持多级缓存自助配置:一级、二级或者两级并用
3、支持缓存单个KEY的超时设置
4、支持缓存一致性
5、支持缓存KEY的spEl表达式,自定义生成策略
6、支持缓存使用、命中率监控(已支持)
7、支持缓存中间件自定义替换(后续支持)
8、支持缓存自动刷新(已支持)
9、支持基于事件更新缓存(已支持)
10、支持缓存预热(已支持)
11、支持jdk1.8及以上版本
语法解析
@U2Cacheable注解
@U2Cacheable作用于方法级别上
名称 | 默认值 | 说明 |
cacheNames | CacheType.LEVEL1TO2 | 缓存名称 |
key | 空字符串 | 缓存key,支持SpEL表达式,提供默认生成策略 |
cacheType | CacheType.LEVEL1TO2 | 缓存策略,支持 CacheType.LEVEL1/CacheType.LEVEL2/CacheType.LEVEL1_TO_LEVEL2三种选择,分别代表本地缓存/远程缓存/两级缓存 |
expireTime | 0 | 超时时间参数: 正数值,如果<=0则不限制超时,d/h/m/s 四种选择,代表天/时/分/秒 |
expireUnit | TimeUnit.MINUTES | 时间单位,支持TimeUnit.DAYS/TimeUnit.HOURS/TimeUnit.MINUTES/TimeUnit.SECONDS |
continueLife | false | 缓存到期前进行重加载处理,不断进行缓存续命 |
preHeat | false | 服务启动阶段进行缓存预热处理 |
listenEventName | "" | 缓存监听事件,可基于缓存监听事件同步清空缓存信息 |
@U2CacheEvict注解
U2CacheEvict作用于方法级别上
名称 | 默认值 | 说明 |
cacheNames | CacheType.LEVEL1TO2 | 缓存名称 |
key | 空字符串 | 缓存key,支持SpEL表达式,提供默认生成策略 |
cacheType | CacheType.LEVEL1TO2 | 缓存策略,支持 CacheType.LEVEL1/CacheType.LEVEL2/CacheType.LEVEL1_TO_LEVEL2三种选择,分别代表本地缓存/远程缓存/两级缓存 |
listenEventName | "" | 缓存监听事件,可基于缓存监听事件同步清空缓存信息 |
@U2CachePut注解
U2CachePut作用于方法级别上
名称 | 默认值 | 说明 |
cacheNames | CacheType.LEVEL1TO2 | 缓存名称 |
key | 空字符串 | 缓存key,支持SpEL表达式,提供默认生成策略 |
cacheType | CacheType.LEVEL1TO2 | 缓存策略,支持 CacheType.LEVEL1/CacheType.LEVEL2/CacheType.LEVEL1_TO_LEVEL2三种选择,分别代表本地缓存/远程缓存/两级缓存 |
expireTime | 0 | 超时时间参数: 正数值,如果<=0则不限制超时,d/h/m/s 四种选择,代表天/时/分/秒 |
expireUnit | TimeUnit.MINUTES | 超时时间单位,支持TimeUnit.DAYS/TimeUnit.HOURS/TimeUnit.MINUTES/TimeUnit.SECONDS |
快速使用
-
导入maven
<dependency>
<groupId>com.guanyu.j2cache</groupId>
<artifactId>u2cache-core</artifactId>
<version>xxxxx</version>
</dependency>
-
引入插件
@SpringBootApplication(scanBasePackages = {"com.guanyu.u2cache"}) //扫描目录
@EnableCaching
@EnableScheduling
@U2CacheBothUseble //引入插件
public class U2CacheApplication {
public static void main(String[] args) {
SpringApplication.run(U2CacheApplication.class, args);
}
}
-
配置缓存
如果引入二级缓存,则需要配置对应地址
redisson:
## redis模式:1-单机 2-集群 3-哨兵
mode: 1
## 数据区域
database: 3
## 地址,可根据逗号分隔,例如11.168.3.186:6379,11.168.3.186:6379
addresses: 11.168.3.186:6379
##是否需要密码
isNoPass: false
## 密码
password: 123456
## 超时时间设置
timeout: 5000
## 最小活跃数
minIdle: 10
## 最大活跃数
maxIdle: 10
# ## 线程数
# threads: 10
# ## netty线程池数
# nettyThreads: 10
-
标注使用
@U2Cacheable(cacheNames = {"localCache", "remoteCache"}, key = "'['+#ttt.name+#ttt.age+']'", cacheType = CacheType.LEVEL2CACHE, expireTime = 1)
public List<Teacher> findListsByInfoLevel2(Teacher ttt){
log.info("进入二级缓存方法");
List<Teacher> teachers=new ArrayList();
Teacher teacher=new Teacher();
teacher.setName("lili");
teacher.setAge(16);
teachers.add(teacher);
return teachers;
}
版本发布
版本号 | 日期 | 说明 |
v1.0 | 2023-11-15 | 初始化版本 |
v1.0.1 | 2023-11-18 | 解决二级缓存时间过期失效bug |
v1.1 | 2023-11-19 | 新增缓存续命功能 |
v1.2 | 2023-11-25 | 新增缓存预热功能 |
v1.2.1 | 2023-11-26 | 新增主机唯一性锁、优化代码包分布 |
v1.3 | 2023-12-03 | 新增基于事件更新缓存机制 |
v1.3.1 | 2023-12-06 | 解决缓存同步时,二级缓存异常同步问题 |
v1.3.2 | 2023-12-10 | 支持缓存手动操作 |
v1.3.3 | 2023-12-13 | 支持缓存占用、热点key使用 |