阿里巴巴开源的通用缓存访问框架JetCache介绍

摘要: JetCache是由阿里巴巴开源的通用缓存访问框架,如果你对Spring Cache很熟悉的话,请一定花一点时间了解一下JetCache,它更好用。JetCache可以做类似Spring Cache的注解式缓存,支持TTL、多级缓存、分布式自动刷新,也提供类似JSR107规范的Cache API。

JetCache是由阿里巴巴开源的通用缓存访问框架,如果你对Spring Cache很熟悉的话,请一定花一点时间了解一下JetCache,它更好用。

JetCache提供的核心能力包括:

  • 提供统一的,类似jsr-107风格的API访问Cache,并可通过注解创建并配置Cache实例
  • 通过注解实现声明式的方法缓存,支持TTL和两级缓存
  • 分布式缓存自动刷新,分布式锁 (2.2+)
  • 支持异步Cache API
  • Spring Boot支持
  • Key的生成策略和Value的序列化策略是可以定制的
  • 针对所有Cache实例和方法缓存的自动统计

我们直接看代码,最简单的使用场景是这样的:

public interface UserService {@Cached(expire = 3600, cacheType = CacheType.REMOTE)User getUserById(long userId);
}

这和Spring Cache很像,不过@Cached注解原生支持了TTL(超时时间),cacheType有LOCAL/REMOTE/BOTH三种选择,
分别代表本地内存/远程Cache Server(例如Redis)/两级缓存,可根据情况选用,合理的使用LOCAL或BOTH类型可以降低Cache Server的压力以及我们提供的服务的响应时间。

再看个复杂点的例子:

public interface UserService {@Cached(name="userCache-", key="#userId", expire = 3600)User getUserById(long userId);@CacheUpdate(name="userCache-", key="#user.userId", value="#user")void updateUser(User user);@CacheInvalidate(name="userCache-", key="#userId")void deleteUser(long userId);
}

第一个例子中我们没有指定key,JetCache会根据参数自动生成,这个例子我们指定了key,并且展示了缓存的更新和删除。

自动刷新是JetCache的大杀器:

public interface SummaryService{@Cached(expire = 3600, cacheType = CacheType.REMOTE)@CacheRefresh(refresh = 1800, stopRefreshAfterLastAccess = 3600, timeUnit = TimeUnit.SECONDS)BigDecimal salesVolumeSummary(int timeId, long catagoryId);
}

cacheType为REMOTE或者BOTH的时候,刷新行为是全局唯一的,也就是说,即使应用服务器是一个集群,也不会出现多个服务器同时去刷新一个key的情况。
一个key的刷新任务,自该key首次被访问后初始化,如果该key长时间不被访问,在stopRefreshAfterLastAccess指定的时间后,相关的刷新任务就会被自动移除,这样就避免了浪费资源去进行没有意义的刷新。

加在方法上的注解毕竟不能提供最灵活的控制,所以JetCache提供了Cache API,使用起来就像Map一样:

UserDO user = userCache.get(12345L);
userCache.put(12345L, loadUserFromDataBase(12345L));
userCache.remove(12345L);userCache.computeIfAbsent(1234567L, (key) -> loadUserFromDataBase(1234567L));

实际上Cache API实现了jsr107规范Cache接口的部分方法,以后的大版本可能会完整实现。

Cache实例可以通过注解创建:

@CreateCache(expire = 100, cacheType = CacheType.BOTH, localLimit = 50)
private Cache<Long, UserDO> userCache;

也可以通过和guava cache/caffeine类似的builder来创建:

GenericObjectPoolConfig pc = new GenericObjectPoolConfig();
pc.setMinIdle(2);
pc.setMaxIdle(10);
pc.setMaxTotal(10);
JedisPool pool = new JedisPool(pc, "localhost", 6379);
Cache<Long, UserDO> userCache = RedisCacheBuilder.createRedisCacheBuilder().keyConvertor(FastjsonKeyConvertor.INSTANCE).valueEncoder(JavaValueEncoder.INSTANCE).valueDecoder(JavaValueDecoder.INSTANCE).jedisPool(pool).keyPrefix("userCache-").expireAfterWrite(200, TimeUnit.SECONDS).buildCache();

Cache接口支持异步:

CacheGetResult r = cache.GET(userId);
CompletionStage<ResultData> future = r.future();
future.thenRun(() -> {if(r.isSuccess()){System.out.println(r.getValue());}
});

可以实现不严格的分布式锁:

cache.tryLockAndRun("key", 60, TimeUnit.SECONDS, () -> heavyDatabaseOperation());

使用Cache API也可以做自动刷新哦:

@CreateCache
@CacheRefresh(timeUnit = TimeUnit.MINUTES, refresh = 60)
private Cache<String, Long> orderSumCache;@PostConstruct
public void init(){orderSumCache.config().setLoader(this::loadOrderSumFromDatabase);
}

如果没有使用注解,用builder一样也可以做出自动刷新:

Cache<String, Long> orderSumCache = RedisCacheBuilder.createRedisCacheBuilder()......省略.refreshPolicy(RefreshPolicy.newPolicy(60, TimeUnit.SECONDS)).loader(this::loadOrderSumFromDatabase).buildCache();

当前支持的缓存系统包括以下4个,而且要支持一种新的缓存也是非常容易的:

  • Caffeine(基于本地内存)
  • LinkedHashMap(基于本地内存,JetCache自己实现的简易LRU缓存)
  • Alibaba Tair(相关实现未在Github开源,在阿里内部Gitlab上可以找到)
  • Redis

使用JetCache的系统需求:

  • JDK:必须Java 8
  • Spring Framework:4.0.8以上,如果不使用注解就不需要
  • Spring Boot:1.1.9以上(可选)

更多文档可以在github的wiki上找到。

原文链接

干货好文,请关注扫描以下二维码:



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里深度学习的“金刚钻”——千亿特征XNN算法及其落地实践

摘要&#xff1a;随着十二点的钟声响起&#xff0c;无数人盯着购物车开启了一年一度的“剁手”之旅。可你有没有想过这购物狂欢的背后是什么支撑起了数据规模如此庞大的计算任务&#xff1f;其实不只是“双十一”&#xff0c;每一个用户的点击和浏览&#xff0c;每一件宝贝的排…

全球唯一:MySQL社区2018年度公司贡献奖颁给阿里云

摘要&#xff1a;在刚刚的Percona Live开源数据库大会上&#xff0c;MySQL社区委员会宣布将2018年度的MySQL社区公司贡献奖&#xff08;Corporate Contributor Award&#xff09;唯一颁给阿里云。图中右一为阿里云数据库RDS团队 彭立勋MySQL社区颁发次奖项是为了感谢阿里云多年…

模拟灰度传感器循迹的程序_灰度传感器的工作原理

灰度传感器是模拟传感器&#xff0c;有一只发光二极管和一只光敏电阻&#xff0c;安装在同一面上。灰度传感器利用不同颜色的检测面对光的反射程度不同&#xff0c;光敏电阻对不同检测面返回的光其阻值也不同的原理进行颜色深浅检测。在有效的检测距离内&#xff0c;发光二极管…

Docker Nexus3 maven 私服(搭建篇)

文章目录一、环境准备1. 安装docker2. 启动docker3. 拉取镜像4. 目录权限5. 创建容器6. 监控日志二、登录配置2.1. 效果验证2.2. 登录2.3. 初始化一、环境准备 1. 安装docker 使用yum命令在线安装 yum install docker2. 启动docker systemctl start docker3. 拉取镜像 doc…

这个充电宝太黑科技了,又小又不用自己带线,长见识了~

戳蓝字“CSDN云计算”关注我们哦&#xff01;现如今我们出门时&#xff0c;手机几乎都是随身携带支付用手机&#xff0c;移动办公用手机&#xff0c;刷剧玩游戏用手机手机可以说与我们工作&#xff0c;生活密不可分。只不过手机频率使用如此之高&#xff0c;也使得用电量大增当…

QuickBI助你成为分析师——群空间自主开通嵌入第三方报表权限

摘要&#xff1a; 用户使用过程中经常需要将创建的仪表板嵌入至自己应用中&#xff0c;方便查看。目前目前高级版群空间下支持用户自助化开通报表权限&#xff0c;通过获取拼接Token方式后台验证更加严格&#xff0c;并且支持实时更新/关闭Token以保证数据安全。用户使用过程中…

如何查看一个组件的 classid是多少_万一免五(万1免5)是骗人的吗?如何查看自己的交易费率是多少?万一免五最新问题汇总!...

前言每天都会遇到很多问题&#xff0c;大多数问题是重复的&#xff0c;所以整理到公众号里&#xff0c;希望你们看一下&#xff0c;别再一遍遍问了....万一免五开户是真的吗&#xff1f;随着监管越来越严&#xff0c;可以给万一免五的券商也越来越少&#xff0c;只要赶在万一免…

阿里云直播转点播最佳实践

摘要&#xff1a; 在前不久刚刚落幕的深圳云栖大会现场&#xff0c;有一个直播间体验项目引起了现场参会嘉宾的关注。云栖直播间是以视频云技术为基础&#xff0c;为云计算从业者量身打造了一个科技直播间&#xff0c;让每位嘉宾都可以过一把当“网红主播”的瘾。前言在前不久刚…

假如从餐饮店的角度来看架构…

戳蓝字“CSDN云计算”关注我们哦&#xff01;麦当劳作为世界快餐业的巨头之一&#xff0c;可以说是风靡全球圈粉无数。小编个人也是麦当劳的忠实粉丝之一。今天的文章主要就是从餐饮店的角度来讲讲的互联网技术架构发展故事。为了方便故事的讲解&#xff0c;我们假定创始人名称…

Maven依赖方式引用UEditor的jar包

使用UEditor时候&#xff0c;如果不引入相关jar包&#xff0c;controller.jsp就会报找不到类的错误&#xff0c;一些功能也无法实现。但是maven中央仓库没有这两个相关的jar包&#xff0c;用直接导入的方式又显得莫名其妙&#xff0c;那么怎么通过maven方式依赖呢&#xff1f; …

编译期java_java编译期和运行期

举个例子&#xff0c;当我们作为开发人员&#xff0c;在电脑上拼死拼活写了一个版本的代码&#xff0c;然后将代码提交到git上去&#xff0c;当我们用jekins或其他工具将代码从git上clone下来&#xff0c;使用mvn package&#xff0c;或者mvn intall打包的过程就叫编译期。是指…

【新功能】媒体处理MPS全新支持自适应多码率、多语言音轨

摘要&#xff1a; 视频内容的分发与播放已经深入了各行业的各类业务场景之中&#xff0c;对于视频平台而言&#xff0c;在不同网络状况下&#xff0c;都能以最优质的状况播放视频&#xff0c;满足用户对于观看体验的更高追求是一个不变的目标。为了更好的满足视频云客户的需求&…

python 查看变量_剖析python运算符is和==的区别

is和这两个运算符一直是困扰python的初学者&#xff0c;它们都可以用来判断某个对象是否是某个值&#xff0c;那么到底什么时候用is&#xff0c;什么时候用去判断某个对象是否是某个值哪&#xff1f;下面勇哥结合实例给大家分享下两者的区别和使用建议。一、引入首先python是一…

Docker是啥?容器变革的火花?

戳蓝字“CSDN云计算”关注我们哦&#xff01;编译作者&#xff1a;风车云马&#xff08;微信号&#xff1a;zhangyisq&#xff09;文︱Serdar Yegulalp本篇文章转自InfoWorld网站在畅聊Docker之前&#xff0c;我们先讲讲什么是容器&#xff1f; …

DRDS到MaxCompute(原ODPS)数据归档性能优化测试

摘要&#xff1a; cdp同步基本原理 数据集成&#xff08;Data Integration&#xff09;是阿里巴巴集团提供的数据同步平台。该平台具备可跨异构数据存储系统、可靠、安全、低成本、可弹性扩展等特点&#xff0c;可为 20 多种数据源提供不同网络环境下的离线&#xff08;全量/增…

Vue 项目预热

软件版本Vue.js2.5.2vue-router3.0.1Node.jsv8.15.0NPM6.4.1文章目录一、 Vue项目预热 - 环境配置1. node.js环境配置1-1. node.js下载1-2. node.js安装1-3. node.js安装完成后验证3-2. 创建一个基于 webpack 模板的项目3-3. 以npm形式运行travel项目 dev环境一、 Vue项目预热 …

activiti动态办理人_安全生产许可证办理相关问题

安全生产许可证办理相关问题众所周知&#xff0c;安全生产许可证是建筑企业的重要证件&#xff0c;也是企业开展工程的保障&#xff0c;取得建筑资质证书后必须申请安许证。在建筑企业动态核查中&#xff0c;安许证及其相关安全生产条件是核查的重点&#xff0c;虽然安全许可证…

超干货|使用Keras和CNN构建分类器(内含代码和讲解)

摘要&#xff1a; 为了让文章不那么枯燥&#xff0c;我构建了一个精灵图鉴数据集&#xff08;Pokedex&#xff09;这都是一些受欢迎的精灵图。我们在已经准备好的图像数据集上&#xff0c;使用Keras库训练一个卷积神经网络&#xff08;CNN&#xff09;。为了让文章不那么枯燥&a…

网易云音乐热评的规律,44万条数据告诉你

戳蓝字“CSDN云计算”关注我们哦&#xff01;网易云的每日推荐里藏着你听过的歌&#xff0c;你听过的歌里藏着你的故事。网易云音乐的评论里&#xff0c;藏着许多人的故事。我们爬取了网易云音乐歌单中48400首歌的444054条热评&#xff0c;来看看网易云的热门评论里&#xff0c…