在微服务中通过多级缓存避免缓存雪崩的系统及方法与流程

文档序号:17489441发布日期:2019-04-23 20:18阅读:1101来源:国知局
在微服务中通过多级缓存避免缓存雪崩的系统及方法与流程

本发明涉及微服务缓存技术领域,特别是涉及一种在微服务中通过多级缓存避免缓存雪崩的系统及方法。



背景技术:

随着微服务技术的普及,以redis为代表的集中式缓存技术也被越来越广泛的运用到各个云平台中。redis在提高系统吞吐量的同时也引入了一些不可避免的缺点:如每次查询请求都需要通过网络访问redis中的缓存数据,增加了带宽的同时也增加了网络延迟。另外,当redis缓存中的数据达到过期时间后,瞬时大量的请求将会直接访问数据库,这种情况会造成数据库崩溃,称之为缓存雪崩。



技术实现要素:

本发明目的是解决集中式缓存带宽占用高和避免缓存雪崩的问题,提供一种在微服务中通过多级缓存避免缓存雪崩的系统及方法。

本发明是通过下述技术方案来解决上述技术问题的:

本发明提供一种在微服务中通过多级缓存避免缓存雪崩的系统,其特点在于,其包括网关、设有一级缓存的多个微服务云平台、作为二级缓存的redis数据库和mysql数据库;

所述网关用于在收到数据查询请求时根据负载均衡分配原则将该数据查询请求分发至对应的微服务云平台;

所述对应的微服务云平台用于查询本地的一级缓存中是否存在待查询的数据,在为是时直接返回待查询的数据,在为否时查询redis数据库,在二级缓存中存在待查询的数据时获取待查询的数据并反馈给网关,在二级缓存中不存在待查询的数据时查询mysql数据库,在mysql数据库中存在待查询的数据时获取待查询的数据并反馈给网关,在mysql数据库中不存在待查询的数据时反馈无此数据的信息给网关。

较佳地,所述对应的微服务云平台用于无论是否查询到待查询的数据均将查询结果广播给其他的微服务云平台,其他的微服务云平台用于缓存该查询结果,该查询结果包括数据查询请求和是否查询到的结果。

较佳地,该些微服务云平台均采用concurrenthashmap技术来存储一级缓存数据,一级缓存中的每条缓存数据包括缓存数据内容、缓存数据创建时间、缓存数据过期时间和缓存数据命中次数;

所述微服务云平台用于在本地一级缓存中某条缓存数据的缓存数据过期时间到达时判断该条缓存数据的缓存数据命中次数是否低于一设定阈值,在为是时删除该条缓存数据,在为否时将该条缓存数据作为一条新的数据缓存至本地一级缓存中。

较佳地,该条缓存数据在不同的一级缓存中的缓存数据过期时间不同,和/或,该条缓存数据在一级缓存和二级缓存中的缓存数据过期时间不同。

较佳地,所述系统还包括kafka组件,所述kafka组件用于在收到该些微服务云平台中的一个微服务云平台更新数据时,将该条更新数据同步至该些微服务云平台中的其他微服务云平台中。

本发明还提供一种在微服务中通过多级缓存避免缓存雪崩的方法,其特点在于,其包括以下步骤:

s1、网关在收到数据查询请求时根据负载均衡分配原则将该数据查询请求分发至对应的微服务云平台;

s2、对应的微服务云平台查询本地的一级缓存中是否存在待查询的数据,在为是时进入步骤s3,否则进入步骤s4;

s3、对应的微服务云平台直接返回待查询的数据;

s4、对应的微服务云平台查询redis数据库是否存在待查询的数据,在为是时进入步骤s5,否则进入步骤s6;

s5、对应的微服务云平台获取待查询的数据并反馈给网关;

s6、对应的微服务云平台查询mysql数据库是否存在待查询的数据,在为是时进入步骤s7,否则进入步骤s8;

s7、对应的微服务云平台获取待查询的数据并反馈给网关

s8、对应的微服务云平台反馈无此数据的信息给网关。

较佳地,在步骤s8之后中,对应的微服务云平台无论是否查询到待查询的数据均将查询结果广播给其他的微服务云平台,其他的微服务云平台缓存该查询结果,该查询结果包括数据查询请求和是否查询到的结果。

较佳地,该些微服务云平台均采用concurrenthashmap技术来存储一级缓存数据,一级缓存中的每条缓存数据包括缓存数据内容、缓存数据创建时间、缓存数据过期时间和缓存数据命中次数;

微服务云平台在本地一级缓存中某条缓存数据的缓存数据过期时间到达时判断该条缓存数据的缓存数据命中次数是否低于一设定阈值,在为是时删除该条缓存数据,在为否时将该条缓存数据作为一条新的数据缓存至本地一级缓存中。

较佳地,该条缓存数据在不同的一级缓存中的缓存数据过期时间不同,和/或,该条缓存数据在一级缓存和二级缓存中的缓存数据过期时间不同。

较佳地,kafka组件在收到该些微服务云平台中的一个微服务云平台更新数据时,将该条更新数据同步至该些微服务云平台中的其他微服务云平台中。

在符合本领域常识的基础上,上述各优选条件,可任意组合,即得本发明各较佳实例。

本发明的积极进步效果在于:

本发明利用微服务本地内存作为一级缓存(非集中式),利用redis作为二级缓存(集中式),当数据在一级、二级缓存中均不存在时才访问数据库请求数据。

本发明利用多级缓存和差异化的过期时间,来避免多个缓存节点的数据同时过期造成的缓存雪崩问题。一级缓存的存在使得大多数的请求访问本地内存即可,而不需要通过网络访问二级缓存redis,从而能极大的提高系统的响应时间、并节约带宽资源。

附图说明

图1为本发明较佳实施例的在微服务中通过多级缓存避免缓存雪崩的系统的示意图。

图2为本发明较佳实施例的在微服务中通过多级缓存避免缓存雪崩的方法的流程图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

如图1所示,本实施例提供一种在微服务中通过多级缓存避免缓存雪崩的系统,其包括网关、设有一级缓存的多个微服务云平台、作为二级缓存的redis数据库和mysql数据库。

所述网关用于在收到数据查询请求时根据负载均衡分配原则将该数据查询请求分发至对应的微服务云平台。

例如:如图1,网关在收到数据查询请求时根据负载均衡分配原则将该数据查询请求分发至当前相对空闲的微服务云平台a1。

所述对应的微服务云平台用于查询本地的一级缓存中是否存在待查询的数据,在为是时直接返回待查询的数据,在为否时查询redis数据库,在二级缓存中存在待查询的数据时获取待查询的数据并反馈给网关,在二级缓存中不存在待查询的数据时查询mysql数据库,在mysql数据库中存在待查询的数据时获取待查询的数据并反馈给网关,在mysql数据库中不存在待查询的数据时反馈无此数据的信息给网关。

例如:微服务云平台a1查询本地的一级缓存中是否存在待查询的数据,在为是时直接返回待查询的数据,在为否时查询redis数据库,在二级缓存中存在待查询的数据时获取待查询的数据并反馈给网关,在二级缓存中不存在待查询的数据时查询mysql数据库,并将查询到的数据反馈给网关。

在本实施例中,微服务云平台a1无论是否查询到待查询的数据均将查询结果广播给其他的微服务云平台a2和a3,其他的微服务云平台a2和a3缓存该查询结果,该查询结果包括数据查询请求和是否查询到的结果。

无论在本地一级缓存中是否查询到待查询的数据均将查询结果广播给其他的微服务云平台,从而解决缓存穿透问题。假设一个数据查询请求传入了一个不存在的数据id,则该数据100%不存在于一级缓存、二级缓存和数据库中。此时每次请求都会透过缓存直接访问数据库,加重了数据库的负担,此种情况称之为缓存穿透。而本实施例通过无论是否查询到待查询的数据均将查询结果广播给其他的微服务云平台,这样,在其他的微服务云平台收到该条数据查询请求时就可以无需再查询二级缓存和数据库了,而是直接返回无此数据的信息即可。

为了快速检索缓存数据,在考虑大并发的情况下,该些微服务云平台均采用concurrenthashmap技术来存储一级缓存数据,一级缓存中的每条缓存数据包括缓存数据内容、缓存数据创建时间、缓存数据过期时间和缓存数据命中次数。

微服务云平台a1、a2或a3在本地一级缓存中某条缓存数据的缓存数据过期时间到达时判断该条缓存数据的缓存数据命中次数是否低于一设定阈值,在为是时删除该条缓存数据,在为否时将该条缓存数据作为一条新的数据缓存至本地一级缓存中。

在本实施例中,为了解决缓存雪崩问题,设置该条缓存数据在不同的一级缓存中的缓存数据过期时间不同,该条缓存数据在一级缓存和二级缓存中的缓存数据过期时间不同。通过将一级缓存和二级缓存中配置差异化过期时间,可以最大程度避免多级缓存同时过期的情况,如一级缓存5分钟过期,二级缓存6分钟过期。另外在不同的一级缓存之间,过期时间也不一样。

每个缓存实例启动后都会通过random类随机添加过期增益时间,因此不同的一级缓存的数据过期时间会有些许差异。这样即使某个一级缓存数据过期,由于微服务自身的负载均衡特性,大量的请求会被平摊到每个微服务云平台中,因此只会有小部分请求通过一级缓存来请求二级缓存。假设此时二级缓存数据刚好也过期,才会请求到mysql数据库。此时的访问量很小,不会对mysql数据库造成太大的负担。向mysql数据库查询完毕后,数据过期的一级缓存节点会把查询到的数据作为新数据更新到内存中,并广播给其他一级缓存节点。其他一级缓存节点在数据更新的同时,过期时间也会被更新。因此某个热点数据过期的情况,往往只会出现在少量的一级缓存节点上,此时只会有少量的请求会请求到二级缓存或mysql数据库,这样就不会出现缓存雪崩的情况。

为了解决缓存之间数据同步的问题。同一个微服务往往存在多个微服务云平台实例如a1、a2和a3。当其中一个微服务云平台更新某条数据时,需要将这条变更数据同步至其他微服务实例a2和a3中。本发明使用kafka等消息中间件发送和接受更新后的数据。数据变更方作为发送方,其他相关微服务作为接收方。具体地,所述系统还包括kafka组件,所述kafka组件用于在收到该些微服务云平台中的一个微服务云平台更新数据时,将该条更新数据同步至该些微服务云平台中的其他微服务云平台中。

一级缓存、二级缓存和数据库的数据一致性问题。在本发明中二级缓存redis的数据和数据库的数据是通过本地事务来保证,要么同时更新成功,要么都不更新。因此二者持有的数据是强一致的。一级缓存的数据更新时通过kafka广播来实现的存在些许的延迟,最终是一致性的。

如图2所示,本实施例还提供一种在微服务中通过多级缓存避免缓存雪崩的方法,其包括以下步骤:

步骤101、网关在收到数据查询请求时根据负载均衡分配原则将该数据查询请求分发至对应的微服务云平台;

步骤102、对应的微服务云平台查询本地的一级缓存中是否存在待查询的数据,在为是时进入步骤103,否则进入步骤104;

步骤103、对应的微服务云平台直接返回待查询的数据;

步骤104、对应的微服务云平台查询redis数据库是否存在待查询的数据,在为是时进入步骤105,否则进入步骤106;

步骤105、对应的微服务云平台获取待查询的数据并反馈给网关;

步骤106、对应的微服务云平台查询mysql数据库是否存在待查询的数据,在为是时进入步骤107,否则进入步骤108;

步骤107、对应的微服务云平台获取待查询的数据并反馈给网关

步骤108、对应的微服务云平台反馈无此数据的信息给网关。

在步骤108之后,对应的微服务云平台无论是否查询到待查询的数据均将查询结果广播给其他的微服务云平台,其他的微服务云平台缓存该查询结果,该查询结果包括数据查询请求和是否查询到的结果。

虽然以上描述了本发明的具体实施方式,但是本领域的技术人员应当理解,这些仅是举例说明,本发明的保护范围是由所附权利要求书限定的。本领域的技术人员在不背离本发明的原理和实质的前提下,可以对这些实施方式做出多种变更或修改,但这些变更和修改均落入本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1