一种接口调用的缓存实现方法

文档序号:6524781阅读:194来源:国知局
一种接口调用的缓存实现方法
【专利摘要】本申请公开了一种接口调用的缓存实现方法,将集中式缓存和单机缓存有效结合起来,利用单机的Ehcache缓存保存的接口版本号信息,对单机的内存缓存中的接口信息的时效性进行监控,并且在接口调用时优先从本地的单机缓存中获取接口调用返回结果,这样,在接口更新频率低的情况下可以充分利用本地的单机缓存来获取接口调用返回结果,在接口频率高的情况下可以利用集中缓存来获取接口调用返回结果,从而既可以解决单机缓存的数据一致性问题,又可以充分利用单机缓存,有效降低集中式缓存的压力、减少网络传输开销、避免系统资源浪费。
【专利说明】—种接口调用的缓存实现方法
【技术领域】
[0001]本发明涉及缓存技术,特别是涉及一种接口调用的缓存实现方法。
【背景技术】
[0002]目前,在互联网等领域的大型高并发、高负载的WEB系统中,一般都采用缓存技术来提高性能。没有缓存技术的支持,无法解决WEB系统的大并发问题,即使解决也会付出很大的成本代价,因此,一个优秀的缓存方案对于大型高并发系统是非常重要的。
[0003]根据系统规模不同,现有的缓存技术包括两种,一种是单机缓存,另一种是集中式缓存。单机缓存就是WEB应用和缓存是同一个应用,也就是最简单的缓存策略,在基于Java的程序中使用的HashMap、List这些都可以算作缓存的范畴。集中式缓存是利用Redis等软件组成缓存服务集群,由该服务集群专门提供缓存服务。
[0004]内存缓存适用于小型应用、部署单个应用实例或者单台服务器的应用场景。由于单机缓存存在无法保障多个应用实例(集群)数据一致性问题,因此应用实例无法扩展,也就无法在大型分布式系统采用。
[0005]目前,对于大型分布式应用,通常采用集中式缓存方案。但是,在集中式缓存方案中,所有的调用都要通过网络调用缓存服务器来实现,这样,在调用量特别大的情况下,就会造成网络拥塞,甚至缓存服务器本身的性能问题。同时,对于并非实时更新(即更新频率低)的接口,如基础资料接口等,这种开销又是没有必要的,因此会造成系统资源浪费。

【发明内容】

[0006]有鉴于此,本发明的主要目的在于提供一种接口调用的缓存实现方法,该方法既可以解决单机缓存的数据一致性问题,又可以有效降低集中式缓存服务器的压力、减少网络传输开销、避免系统资源浪费。
[0007]为了达到上述目的,本发明提出的技术方案为:
[0008]一种接口调用的缓存实现方法,包括:
[0009]a、调用方应用程序在执行一外部应用程序的接口调用时,查询所在单机的Ehcache缓存,获取当前所调用接口的版本号Ml ;
[0010]b、所述调用方应用程序查询所在单机上的内存缓存,获取所述接口的版本号M2和当前接口调用传入实参对应的缓存结果创建时间;
[0011 ] C、当所述版本号Ml与所述版本号M2相同并且所述创建时间不超过预设的有效期时,从所述内存缓存中获取所述接口的所述接口调用传入实参对应的返回结果,结束所述方法;
[0012]d、当所述版本号Ml与所述版本号M2不相同和/或所述创建时间超过预设时间门限时,清除所述内存缓存中所述接口的所述接口调用传入实参对应的相关信息;所述调用方应用程序从集中缓存服务集群设备中获取所述接口的版本号M3和所述接口调用的返回结果,如果所述获取成功,则利用所述接口的版本号M3和所述返回结果,对所述内存缓存中所述接口的相关信息进行更新,否则,所述调用方应用程序通过触发所述外部应用程序执行所述接口调用,获取所述接口调用的返回结果,并且所述外部应用程序利用当前执行的所述接口调用的返回结果和所述接口的版本号,对所述集中缓存服务集群设备中所述接口的相关信息进行更新。
[0013]综上所述,本发明提出的接口调用的缓存实现方法,将集中式缓存和单机缓存有效结合起来,利用单机的Ehcache缓存保存的接口版本号信息,对单机的内存缓存中的接口信息的时效性进行监控,并且在接口调用时优先从本地的单机缓存中获取接口调用返回结果,这样,在接口更新频率低的情况下可以充分利用本地的单机缓存来获取接口调用返回结果,在接口频率高的情况下可以利用集中缓存来获取接口调用返回结果,从而既可以解决单机缓存的数据一致性问题,又可以充分利用单机缓存,有效降低集中式缓存的压力、减少网络传输开销、避免系统资源浪费。
【专利附图】

【附图说明】
[0014]图1为本发明实施例一的流程示意图。
【具体实施方式】
[0015]为使本发明的目的、技术方案和优点更加清楚,下面将结合附图及具体实施例对本发明作进一步地详细描述。
[0016]本发明的核心思想是:将集中式缓存和单机缓存有效结合起来,既确保了单机缓存的数据一致性,又充分利用单机缓存,有效地降低集中式缓存的压力、减少网络传输开销、避免系统资源浪费。
[0017]图1为本发明实施例一的流程示意图,如图1所示,该实施例主要包括:
[0018]步骤101、调用方应用程序在执行一外部应用程序的接口调用时,查询所在单机的Ehcache缓存,获取当前所调用接口的版本号Ml。
[0019]本步骤中用于从Ehcache缓存中获取当前所调用接口的版本号Ml,以便在后续步骤中基于此对调用方所在单机内存缓存中的接口信息是否过时进行判断。
[0020]需要说明的是,Ehcache缓存是一个纯JAVA的进程内缓存框架,具有快速精干等特点,是Hibernate中默认的CacheProvider,具体实现为本领域人员所掌握,在此不再赘述。
[0021]这里,利用Ehcache缓存来存放已调用过的所有接口和对应的版本号信息,以监控单机内存缓存中的接口信息是否是最新的信息。
[0022]步骤102、所述调用方应用程序查询所在单机上的内存缓存,获取所述接口的版本号M2和当前接口调用传入实参对应的缓存结果创建时间。
[0023]本步骤中,用于从内存缓存中获取所述接口的版本号M2和创建时间信息,以便通过与Ehcache缓存中获取的版本号Ml和预设的有效期进行比较,判断出内存缓存中的接口信息是否过期。具体可以采用下述步骤获取所述接口的版本号M2和创建时间信息:
[0024]以所述接口为索引查找所述内存缓存,得到所述接口对应的接口信息,从所述接口信息中获取所述接口的版本号和当前接口调用传入实参对应的创建时间,其中,所述接口信息包括接口的版本号、接口调用传入实参以及各接口调用传入实参对应的接口调用返回结果、创建时间和有效期。
[0025]这里需要说明的是,在单机的内存缓存中,每种接口调用传入实参组合将对应一条记录,一条记录将包含本次接口调用的相关接口信息,即包括接口调用返回结果、创建时间和有效期。本发明在具体实现时,每次接口调用只涉及当前接口调用传入实参对应的记录,而不涉及对该接口的其他的接口调用传入实参组合对应的记录信息,并且当前接口调用传入实参对应的记录将会被锁住,其他的相同接口调用将会被暂停直到该记录解锁。如此,既可以避免影响对该接口的其他接口调用传入实参组合的调用,还可以避免相同接口调用所致的并发调用集中缓存的现象发生。
[0026]步骤103、当所述版本号Ml与所述版本号M2相同并且所述创建时间不超过预设的有效期时,从所述内存缓存中获取所述接口的所述接口调用传入实参对应的返回结果,结束所述方法。
[0027]本步骤中,当所述版本号Ml与所述版本号M2相同并且所述创建时间不超过预设的有效期时,说明本机内存缓存中保存的相关接口信息没有过期,可以直接读取使用,因此,这里直接从所述内存缓存中获取所述接口的所述接口调用传入实参对应的返回结果。
[0028]所述有效期为本领域人员根据实际需要设置的,保存在内存缓存中的接口信息中。
[0029]这里需要说明的是,本发明中当需要进行其他应用程序的接口调用时,优先从本机的内存缓存中读取接口的调用结果信息,只有在本机内存缓存中的数据过期时,才通过网络获取接口的调用结果信息。如此,可以大大减少集中缓存的网络调用,极大地提高了调用效率,降低了网络资源开销,该方法在内容更新频度低的情况下,本地命中缓存的成功率很高,上述技术效果会更显著。
[0030]步骤104、当所述版本号Ml与所述版本号M2不相同和/或所述创建时间超过预设时间门限时,清除所述内存缓存中所述接口的所述接口调用传入实参对应的相关信息;所述调用方应用程序从集中缓存服务集群设备中获取所述接口的版本号M3和所述接口调用的返回结果,如果所述获取成功,则利用所述接口的版本号M3和所述返回结果,对所述内存缓存中所述接口的相关信息进行更新,否则,所述调用方应用程序通过触发所述外部应用程序执行所述接口调用,获取所述接口调用的返回结果,并且所述外部应用程序利用当前执行的所述接口调用的返回结果和所述接口的版本号,对所述集中缓存服务集群设备中所述接口的相关信息进行更新。
[0031]本步骤中,当所述版本号Ml与所述版本号M2不相同时或者所述创建时间超过预设时间门限时,说明内存缓存中保存的所述当前接口调用传入实参对应的接口调用返回信息过期了,需要从集中缓存服务集群设备中或直接触发外部应用程序执行接口调用获取当前的接口调用返回结果。
[0032]本步骤中,优先从集中缓存服务集群设备中获取接口调用返回结果,如果获取不成功,则直接触发外部应用程序执行相关的接口调用,如此可以利用集中缓存提高接口调用返回结果的获取效率。
[0033]这里需要说明的是,通常从集中缓存服务集群设备中获取接口调用返回结果不成功,说明当前的接口调用为首次执行,未曾被缓存过。如果触发外部应用程序执行接口调用,则需要利用当前执行的所述接口调用的返回结果和所述接口的版本号,对所述集中缓存服务集群设备中所述接口的相关信息进行更新,以使集中缓存服务集群设备中保存最新的接口信息,以供此后为应用程序的接口调用提供集中缓存服务。另外,在触发外部应用程序执行接口调用的情况下,只需要对集中缓存服务集群设备中接口的相关信息进行更新,而不再对相关单机中的内存缓存进行更新,可以使得接口调用过程尽可能的短。
[0034]较佳地,为了保障系统更新的效率和稳定性,当接口的信息发生更新时,可以使接口的更新信息与单机的内存缓存信息不同步更新,只将新的接口版本信息保存到相关单机的Ehcache缓存中,当后续应用程序需要调用该接口时,会因为Ehcache缓存与单机缓存中的版本不一致而清除本地缓存,从而可以既避免由于接口数据的更新而造成接口调用返回过期数据的问题,同时可避免对大量单机的内存缓存同步更新接口信息所产生的大量数据传输需求对网络造成的压力。具体地,可以采用下述两种方法实现上述目的:
[0035]方法一:
[0036]当一应用程序中任一接口 X的数据变化时,该应用程序为所述接口 X生成新的版本号,利用所述新的版本号和数据变化后所述接口 X的接口调用结果,对所述集中缓存服务集群设备中所述接口 X的相关信息进行更新,并将接口 X的所述新的版本号发送给订阅所述接口 X的各集群的所有应用程序;
[0037]接收到所述新的版本号的应用程序将所在单机的Ehcache缓存中所述接口 X的版本号更新为所述新的版本号。
[0038]方法二:
[0039]当一应用程序中任一接口 X的数据变化时,该应用程序为所述接口 X生成新的版本号,利用所述新的版本号和数据变化后所述接口 X的接口调用结果,对所述集中缓存服务集群设备中所述接口 X的相关信息进行更新,并将接口 X的所述新的版本号发送给订阅所述接口 X的各集群的任一应用程序;
[0040]接收到所述新的版本号的应用程序利用所述新的版本号,对所在单机的Ehcache缓存中所述接口 X的版本号进行更新,并触发所在集群的其他应用程序将各自所在单机的Ehcache缓存中所述接口 X的版本号更新为所述新的版本号。
[0041]在上述方法一和方法二中,具体可利用现有的应用程序之间的通信方式一消息服务(MQ),将所述接口 X的所述新的版本号发送给订阅所述接口 X的各集群的应用程序。
[0042]上述方法一和方法二的不同之处在于:前者是将接口 X的所述新的版本号发送给订阅所述接口 X的各集群的所有应用程序,后者则不需要发送给所有订阅的应用程序,只需要通知给订阅所更新接口的每个集群的任一应用程序即可,然后再利用Ehcache缓存同步机制将该接口的新版本号通知给集群中的其他应用程序。方法二中将Ehcache缓存同步限制在一个应用集群内部,可以方便进行集群扩展,并可以使MQ服务配置较为简单,避免了系统中应用实例和MQ服务的耦合。在自动发布环境下,一个集群有一个独立的配置,非常重要。
[0043]另外,上述方法中仅对Ehcache缓存中的版本号进行同步,需要同步的缓存内容非常小,如此可以保障同步的稳定性。
[0044]较佳地,针对在实际应用中出现的极端情况:在触发外部应用程序执行接口调用之后,仍未能在接口调用超时前获得有效的接口调用返回结果,可以直接返回本机内存缓存中的相应返回结果。具体地,步骤104中所述调用方应用程序触发所述外部应用程序执行所述接口调用之后进一步包括:
[0045]如果在所述接口调用的时长达到预设的返回时间阈值之时,所述调用方应用程序未能从所述外部应用程序处成功获取所述接口调用的返回结果,则所述调用方应用程序从所在单机的内存缓存中获取所述接口调用的返回结果,并对该返回结果的可信度系数进行降级处理。
[0046]这里,在返回单机的内存缓存中的接口调用返回结果时,需要对该返回结果的可信度系数进行降级处理,即降低其可信度系数值,以通知调用方该结果的可靠性。
[0047]在实际应用中,本发明中所述集中缓存服务集群设备可以为Redis服务集群设备。
[0048]综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种接口调用的缓存实现方法,其特征在于,包括: a、调用方应用程序在执行一外部应用程序的接口调用时,查询所在单机的Ehcache缓存,获取当前所调用接口的版本号Ml ; b、所述调用方应用程序查询所在单机上的内存缓存,获取所述接口的版本号M2和当前接口调用传入实参对应的缓存结果创建时间; C、当所述版本号Ml与所述版本号M2相同并且所述创建时间不超过预设的有效期时,从所述内存缓存中获取所述接口的所述接口调用传入实参对应的返回结果,结束所述方法; d、当所述版本号Ml与所述版本号M2不相同和/或所述创建时间超过预设时间门限时,清除所述内存缓存中所述接口的所述接口调用传入实参对应的相关信息;所述调用方应用程序从集中缓存服务集群设备中获取所述接口的版本号M3和所述接口调用的返回结果,如果所述获取成功,则利用所述接口的版本号M3和所述返回结果,对所述内存缓存中所述接口的相关信息进行更新,否则,所述调用方应用程序通过触发所述外部应用程序执行所述接口调用,获取所述接口调用的返回结果,并且所述外部应用程序利用当前执行的所述接口调用的返回结果和所述接口的版本号,对所述集中缓存服务集群设备中所述接口的相关信息进行更新。
2.根据权利要求1所述的方法,其特征在于,所述方法进一步包括: 当一应用程序中任一接口 X的数据变化时,该应用程序为所述接口 X生成新的版本号,利用所述新的版本号和数据变化后所述接口 X的接口调用结果,对所述集中缓存服务集群设备中所述接口 X的相关信息进行更新,并将接口 X的所述新的版本号发送给订阅所述接口 X的各集群的所有应用程序; 接收到所述新的版本号的应用程序将所在单机的Ehcache缓存中所述接口 X的版本号更新为所述新的版本号。
3.根据权利要求1所述的方法,其特征在于,所述方法进一步包括: 当一应用程序中任一接口 X的数据变化时,该应用程序为所述接口 X生成新的版本号,利用所述新的版本号和数据变化后所述接口 X的接口调用结果,对所述集中缓存服务集群设备中所述接口 X的相关信息进行更新,并将接口 X的所述新的版本号发送给订阅所述接口 X的各集群的任一应用程序; 接收到所述新的版本号的应用程序利用所述新的版本号,对所在单机的Ehcache缓存中所述接口 X的版本号进行更新,并触发所在集群的其他应用程序将各自所在单机的Ehcache缓存中所述接口 X的版本号更新为所述新的版本号。
4.根据权利要求1所述的方法,其特征在于,获取所述接口的版本号M2和创建时间信息包括: 以所述接口为索引查找所述内存缓存,得到所述接口对应的接口信息,从所述接口信息中获取所述接口的版本号和当前接口调用传入实参对应的创建时间,所述接口信息包括接口的版本号、接口调用传入实参以及各接口调用传入实参对应的接口调用返回结果、创建时间和有效期。
5.根据权利要求1所述的方法,其特征在于,步骤d中所述调用方应用程序触发所述外部应用程序执行所述接口调用之后进一步包括:如果在所述接口调用的时长达到预设的返回时间阈值之时,所述调用方应用程序未能从所述外部应用程序处成功获取所述接口调用的返回结果,则所述调用方应用程序从所在单机的内存缓存 中获取所述接口调用的返回结果,并对该返回结果的可信度系数进行降级处理。
【文档编号】G06F12/08GK103645904SQ201310712006
【公开日】2014年3月19日 申请日期:2013年12月20日 优先权日:2013年12月20日
【发明者】李鹏涛, 王进思, 李 杰, 赵玉勇 申请人:北京京东尚科信息技术有限公司, 北京京东世纪贸易有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1