【Java】
Java缓存之JetCache
- 写在前面
- 为什么使用缓存
- 使用场景
- 简介
- 特性
- 缓存类型-两级缓存
- 本地缓存
- 远程(访问Redis的客户端)
- 区别
- Spring Cache:
- JetCache
- 常用注解
- @Cached
- @CacheInvalidate
- @CacheUpdate
- @CreateCache
- @CacheRefresh
写在前面
为什么使用缓存
在高并发、大流量等场景下,降低系统延迟,缓解数据库压力,提高系统整体的性能,也能够让用户有更好的体验;
使用场景
读多写少、不追求强一致性
简介
JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作;
当前有四个实现:RedisCache、RedisLettuceCache、CaffeineCache、LinkedHashMapCache;
特性
- 通过统一的API访问Cache系统
- 通过注解实现声明式的方法缓存,支持TTL(超时时间,Spring Cache Redis 默认只支持配置全局的)和两级缓存
- 通过注解创建并配置Cache实例
- 针对所有Cache实例和方法缓存的自动统计
- Key的生成策略和Value的序列化策略支持自定义配置
- 分布式缓存自动刷新,分布式锁
- 异步Cache API (使用Redis的Lettuce客户端时)
缓存类型-两级缓存
本地缓存
- LinkedHashMap:使用LinkedHashMap做LUR方式淘汰
- Caffeine:基于Java8开发的提供了近乎最佳命中率的高性能的缓存库
- PS:选择了本地缓存请设置limit,全局默认设置了100,本地缓存的数据存放于内存,减轻内存的损耗,如果使用了Caffeine,缓存的key过多可能导致内存溢出
远程(访问Redis的客户端)
- Redis:使用Jedis客户端,Redis官方首选的Java客户端
- RedisLettuce:使用Lettuce客户端,一个高性能基于Java的Redis驱动框架,支持线程安全的同步、异步操作,底层集成了Project Reactor,提供反应式编程;
- PS:选择了远程缓存请设置keyPrefix,保证存放至Redis的缓存key规范化,避免与其他系统出现冲突
区别
Spring Cache:
-
优点
- 支持开箱即用(Out Of The Box),并提供基本的Cache抽象,方便切换各种底层Cache
- 通过Cache注解即可实现缓存逻辑透明化,让开发者关注业务逻辑
- 当事务回滚时,缓存也会自动回滚
- 支持比较复杂的缓存逻辑
- 提供缓存编程的一致性抽象,方便代码维护
-
缺点
- Spring Cache并不针对多进程的应用环境进行专门的处理;
- Spring Cache抽象的操作中没有锁的概念,当多线程并发操作(更新或者删除)同一个缓存项时,有可能读取到过期的数据
- 无法满足本地缓存和远程缓存同时使用,使用远程缓存时无法自动刷新
JetCache
- 优点
- 远程缓存和内存型缓存可以共存,当共存时,优先访问内存,保护远程缓存;也可以只用某一种;
- 自动刷新策略,防止某个缓存失效,访问量突然增大时,所有机器都去访问数据库,可能导致数据库挂掉
- 利用不严格的分布式锁,对同一key,全局只有一台机器自动刷新
- 缺点:
- JetCache通过Spring AOP生成代理,来支持缓存功能
常用注解
@Cached
- @Cached:是在接口方法或者类方法上添加缓存,一般以参数为key,以返回值为value存入缓存中
可配置cacheType参数:REMOTE, LOCAL, BOTH
LOCAL时可配置localLimit参数来设置本地local缓存的数量限制,condition参数可配置在什么情况下使用缓存,condition和key支持SPEL语法; - @CreateCache是直接创建一个缓存实例,然后调用put(T key, T value)、get(T key)等方法实现缓存
- Cache实例的默认超时时间,通过在@CreateCache和@Cached上的expire属性指定,如果没有指定,则使用yml中定义的全局配置
@CacheInvalidate
@CacheInvalidate:缓存失效,同样可配置condition满足的情况下失效缓存,但不能支持是在方法调用前还是调用后将缓存失效;
@CacheUpdate
@CacheUpdate:缓存更新,value为缓存更新后的值,此操作是调用原方法结束后将更新缓存
@CreateCache
@CreateCache:用于字段上的注解,创建缓存,根据参数,创建一个name的缓存,可以全局显式使用这个缓存参数对象
@CacheRefresh
@CacheRefresh:自动刷新策略,可设置refresh、stopRefreshAfterLastAccess、refreshLockTimeout参数;
更多详细配置说明介绍,可仔细查看文档:
发布评论