`
猫耳呀
  • 浏览: 158276 次
社区版块
存档分类
最新评论

阿里巴巴开源的通用缓存访问框架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上找到。
 
阅读更多干货好文,请关注扫描以下二维码:
 
分享到:
评论

相关推荐

    阿里开源的缓存框架JetCache.pdf

    阿里开源的缓存框架JetCache JetCache是阿里开源的缓存框架,提供统一的API和注解来简化缓存的使用。该框架提供了四个实现,分别是RedisCache、TairCache、CaffeineCache和LinkedHashMapCache。 JetCache支持TTL、...

    springboot整合jetcache完整代码

    JetCache是阿里巴巴开源的一款高性能、轻量级的分布式缓存框架,适用于微服务架构中的缓存场景。本文将详细介绍如何在SpringBoot项目中整合JetCache,并探讨其本地缓存和Redis缓存的使用,以及如何实现多缓存的并行...

    druid.rar阿里巴巴开源数据库连接池

    Druid为监控而生的数据库连接池,它是阿里巴巴开源平台上的一个项目。Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能.它可以替换DBCP和C3P0连接池。Druid提供了一个高效、功能强大、可...

    JetCache是一个基于Java的缓存系统封装提供统一的API和注解来简化缓存的使用

    JetCache 是阿里巴巴开源的项目之一,它在阿里巴巴内部经过大规模的生产环境验证,证明了其稳定性和高效性。对于使用阿里巴巴其他中间件(如 Dubbo、Seata)的企业来说,JetCache 可以很好地融入现有的技术栈,提供...

    阿里巴巴开源的Oracle数据迁移同步工具yugong.zip

    yugong 是阿里巴巴推出的去Oracle数据迁移同步工具(全量 增量,目标支持MySQL/DRDS)。2008年左右,阿里巴巴开始尝试MySQL的相关研究,并开发了基于MySQL分库分表技术的相关产品,Cobar/TDDL(目前为阿里云DRDS产品),...

    阿里巴巴Web及框架简介

    "阿里巴巴Web及框架简介"这一主题,核心在于介绍阿里巴巴开发的Web框架,如Webx,以及相关框架的应用和特性。Webx是阿里巴巴开源的一款基于Java的企业级Web应用框架,它旨在提高开发效率,简化项目构建,同时保证...

    数据同步的终极解决方案,阿里巴巴开源的Canal框架当之无愧.docx

    阿里巴巴开源的Canal框架就是针对这一问题提供的一种高效解决方案。 Canal是一个轻量级的数据同步工具,它能够实时捕获并传输MySQL数据库中的DML(数据操纵语言)事件,如INSERT、UPDATE和DELETE,从而实现数据库到...

    maven配置文件阿里巴巴通用版下载settings-alibaba.xml

    阿里巴巴仓库的maven配置文件,链接国内仓库,下载速度快,只需要配置一下本地仓库地址;阿里巴巴仓库的maven配置文件,链接国内仓库,下载速度快,只需要配置一下本地仓库地址;

    阿里巴巴开源服务框架Dubbo.zip

    Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000 个服务提供3,000,000,000 次访问量支持。  Dubbo 也是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入...

    云栖精选12月刊2017年阿里巴巴开源那些事.pdf

    自从 2011 年宣布第一波开源项目以来,阿里巴巴的技术人一直积极参与开源社区共建。开源项目数量每年都有所增长,目前阿里巴巴已经有 150 个开源项目,其中数个项目 star 破万。相关的 GitHub 2017年数据统计显示,...

    阿里巴巴开源的Android手册

    阿里巴巴开源的Android开发手册,资料挺好的,主要分享了阿里内部开发时经验和禁忌,对于有点开发基础的童鞋应该很有启发意义!

    阿里巴巴开源的诊断工具Arthas介绍.ppt

    Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具,开始在淘宝内部孵化使用,后来成为阿里java项目必须使用的内部工具。2018年arthas成为ali开源项目,代码托管在github上。这是带给java系一大福音,项目深受...

    阿里巴巴开源大数据平台演进之路 - 王峰(莫问)-阿里云

    阿里巴巴开源大数据平台演进之路 - 王峰(莫问)_阿里云

    Nacos-阿里巴巴开源项目一个更易于帮助构建云原生应用的动态服务发现配置和服务管理平台

    Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

    阿里巴巴开源移动容器化框架Atlas的技术演进之路

    当大家打开手机淘宝时,可能就会发现阿里巴巴的手淘的业务其实很大,基本上可以在手淘中看到阿里巴巴所有的业务,比如聚划算、天猫等等。特别是在2013年的时候,整个阿里集团开始all in手淘,手淘成为了阿里巴巴集团...

    阿里巴巴普惠体(完整版)

    阿里巴巴普惠体是一款由阿里巴巴集团设计并发布的开源字体,旨在为全球用户提供免费、全面的中文字体解决方案。这款字体覆盖了广泛的语言和字符集,包括简体中文、繁体中文、拉丁字母、希腊字母、西里尔字母以及日...

    阿里巴巴自动登录+私信聊天源码开源+淘宝阿里巴巴营销软件

    该开源项目是一个基于阿里巴巴生态的自动化工具,主要功能包括自动登录和私信聊天。通过分析提供的文件名"已完成-阿里旺旺自动发消息",我们可以推测这个工具专注于阿里旺旺平台的消息发送。以下是对相关知识点的...

    jetcache:JetCache是​​一个Java缓存框架

    JetCache是​​Java缓存抽象,可为各种缓存解决方案提供一致的用法。 它提供的注释比Spring Cache中的注释更强大。 JetCache中的注释支持本地TTL,两级缓存和分布式自动刷新,您也可以手动编写Cache实例。 当前有四...

    首届阿里开源峰会回顾

    BeeHive是阿里巴巴开源的一站式微服务开发框架,它集成了服务治理、配置中心、分布式任务调度等多个功能,帮助开发者快速构建微服务架构。BeeHive的出现,使得开发者能够更加专注于业务逻辑,而无需过多关注底层服务...

Global site tag (gtag.js) - Google Analytics