一种Redis通用中间件的实现方法及装置的制造方法

文档序号:10572762阅读:603来源:国知局
一种Redis通用中间件的实现方法及装置的制造方法
【专利摘要】本发明公开一种Redis通用中间件的实现方法及装置,该方法包括:中间件接收应用发送的读写请求;所述中间件从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体;所述中间件从所述读写请求对应的处理实体的连接池中获取可用的连接链路,并通过所述连接链路发送所述读写请求,用以解决现有技术访问Redis数据库的技术不通用的问题。
【专利说明】
一种Red i s通用中间件的实现方法及装置
技术领域
[0001]本发明涉及通信技术领域,尤其涉及一种Redis通用中间件的实现方法及装置。
【背景技术】
[0002]目前web应用系统为了解决高并发带来的性能问题,都会在web应用系统与数据库之间采取缓存层,使用最为广泛的就是RediS(RediS本质上是一个键-值类型的内存数据库KRedis作为软件和传统数据库之间的缓冲层,操作命令简单,在保证了数据有效性的情况下,同时也保证了高性能。
[0003]Redis是一个开源、支持网络、基于内存的key-value(键-值对)数据库。Redis支持存储的数据类型包括:string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)等。对Redis数据库进行访问的过程,大致可以分为读请求和写请求两种。
[0004]现有的应用对Redis数据库进行访问的过程如图1所示,以读请求为例,应用的m个读请求存放于请求队列12中,m2 I。为了应对大规模的业务访问,为应用部署多个Redis实例14,每个Redis实例14占用一个Redis端口。应用的请求队列12中的读请求由该请求队列12对应的连接池中的η个线程进行处理,η 2 I。对于任一读请求,应用随机分配一个线程进行处理。假设线程I对读请求m进行处理,则线程I读取读请求m的key,并通过哈希算法将key映射到多个Redis端口中的一个,进而通过该Redis端口将读请求下发至与其对应的Redis实例14,并通过该Redi s实例14对该读请求m进行处理。
[0005]在实际应用时,发现上述技术至少存在以下问题:对Redis数据库访问的前序工作都由应用来完成,而现有的应用对应的开发语言不同,因此对于不同开发语言的应用均需要对应地开发上述访问Redis数据库的处理模块,所以不具有通用性。

【发明内容】

[0006]本发明实施例提供一种Redis通用中间件的实现方法及装置,用以解决现有技术访问Redis数据库的技术不通用的问题。
[0007]本发明方法包括一种Redis通用中间件的实现方法,该方法包括:中间件接收应用发送的读写请求;所述中间件从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体;所述中间件从所述读写请求对应的处理实体的连接池中获取可用的连接链路,并通过所述连接链路发送所述读写请求。
[0008]基于同样的发明构思,本发明实施例还提供一种Redis通用中间件,包括:接收单元,用于接收应用发送的读写请求;确定单元,用于从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体;处理单元,用于从所述读写请求对应的处理实体的连接池中获取可用的连接链路,并通过所述连接链路发送所述读写请求。
[0009]本发明实施例通过一个通用的中间件实现现有应用访问Redis数据库的过程,SP该中间件接收应用发送的读写请求,并从从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体,然后从所述读写请求对应的处理实体的连接池中获取可用的连接链路,并通过所述连接链路发送所述读写请求,因为中间件实现了现有应用访问Redis数据库的过程,其它应用通过调用中间件的接口既可以访问Redis数据库,而不需要进行额外的开发,使得这一访问Redis数据库的技术具有通用性。
【附图说明】
[0010]为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0011]图1为现有技术中应用对Redis数据库进行访问的过程;
[0012]图2为本发明实施例提供一种Redis通用中间件的实现方法流程示意图;
[0013]图3为本发明实施例提供一种包含Redis通用中间件的Redis集群架构;
[OOM]图4为本发明实施例提供一种包含Redis通用中间件、代理节点的Redis集群架构;
[0015]图5为本发明实施例还提供一种Redis通用中间件。
【具体实施方式】
[0016]为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部份实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
[0017]参见图2所示,本发明实施例提供一种Redis通用中间件的实现方法流程示意图,具体地实现方法包括:
[0018]步骤SlOl,中间件接收应用发送的读写请求。
[0019]步骤S102,所述中间件从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体。
[0020]步骤S103,所述中间件从所述读写请求对应的处理实体的连接池中获取可用的连接链路,并通过所述连接链路发送所述读写请求。
[0021]因为在实际应用中传统的Redis的部署方式有多种结构,其中有两种比较典型的部署方式,第一种部署方式是Redis集群中有若干实例组,应用程序与多个实例组直连,SP应用程序连接有多组主从配合的服务器,每个主服务器中运行若干负责数据备份的实例;另一种部署方式则是较第一种部署方式多个代理节点,由代理节点管控若干个实例组,由代理节点实现数据分片的功能,即应用程序发送的读写请求通过代理节点分配至相应的实例组处理。
[0022]考虑到本发明实施例中的通用的中间件需要满足上述两种部署结构,所以在步骤S102中,与所述中间件连接的处理实体指的是每组主从配合的服务器或者是代理节点。
[0023]一种实施方式是:假设与所述中间件连接的处理实体为Redis服务器;所述中间件从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体,包括:
[0024]根据所述读写请求中的数据主键值,确定对应的Redis服务器;
[0025]根据所述数据主键值进行哈希运算生成的哈希值,确定对应的所述Redis服务器的端口 ;根据确定的端口确定所述读写请求对应的Redis实例。
[0026]也就是说,对于第一种部署结构,本发明实施例通过增加一种通用的中间件来代替每个应用程序访问Redis数据库的功能,即通用的中间件通过接口连接应用程序,接收来自应用程序的读写请求,然后根据读写请求中的数据主键值,也就是key找到对应的主服务器,因为每个主服务器中运行着多个实例,所以在根据key进行hash(哈希)运算找到对应的端口,进而根据确定的端口找到该条读写请求对应的Redis实例。
[0027]例如,图3所示,应用连接通用的中间件,中间件下面又连接两个主从配合的Redis服务器,每个Redis服务器中运行两个Redis实例,针对中间件来讲,可以包含四个功能部分,分别是数据分片、负载均衡、连接池和连接链路四个部分。
[0028]其中,数据分片指的是将数据主键按照一定的分组规则投放到相应的Redis服务器。本申请是采用通用的hash分片算法,即根据数据主键值,确定对应的Redis服务器;再根据所述数据主键值进行哈希运算生成的哈希值,确定对应的所述Redis服务器的端口;根据确定的端口确定所述读写请求对应的Redis实例,当然也可以根据实际需要使用其它的分片算法。负载均衡功能指的是采用RoundRobin (轮询调度)和WeightedRoundRobin(权重轮询调度)两种负载策略对每个Redis服务器内的实例进行调度。连接池是是由中间件与Redis服务器之间进行通信的连接链路组成的,即连接池用于缓存中间件与Redis实例之间的长连接。同时还具有其他一些基本功能,如维持最小连接数、限制最大连接数和空闲连接数等;同时它还支持一些高级功能,如请求队列、获取连接超时限制、获取连接时检测、归还连接时检测等。中间件可以根据需要使用这些功能,以使提高程序性能。
[0029]在这种部署结构中,对于中间件来说,中间件收到应用程序发来的读写请求,首先实现数据分片功能,即将根据读写请求中的数据主键值确定本条读写请求对应的哪个Redis服务器,再根据数据主键值进行哈希运算生成的哈希值,确定对应的所述Redis服务器的端口 ;根据确定的端口确定所述读写请求对应的Redis实例。当确定好Redis实例之后,中间件从该Redis实例对应的连接池中获取一个长连接,这样就可以通过长连接发送该条读写请求了。
[°03°]进一步地,为了避免Redis实例发生故障,造成读写失败,中间件定期向所述读写请求对应的Redis实例发送心跳检测;若心跳检测成功,则从心跳检测成功的Redis实例对应的连接池中获取可用的连接链路。也就是说,启动单独的线程定期地向每个Redis实例发送检测报文,根据其响应来判断其健康状态。另外,也向外部调用者开放了反馈接口,当调用者读写Redis遇到异常时,可以调用反馈接口,以便及时对Redis实例的健康状态进行更新。
[0031]另一种实施方式是:假设与所述中间件连接的处理实体为代理节点;
[0032]所述中间件从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体,包括:所述中间件根据各代理节点的工作状态,确定所述读写请求对应的代理节点;
[0033]所述通过所述连接链路发送所述读写请求,包括:
[0034]所述读写请求对应的代理节点根据所述读写请求中的数据主键值,确定对应的Redis实例;所述读写请求对应的代理节点与所述Redis实例建立链路并将所述读写请求发送给所述对应的Red i s实例。
[0035]也就是说,对于第二种部署结构,本发明实施例中的通用的中间件通过接口连接应用程序,接收来自应用程序的读写请求,然后根据各代理节点的工作状态,确定所述读写请求对应的代理节点。其中,确定代理节点的方法可以按照如下方式确定,即所述中间件利用轮询调度从与所述中间件连接的代理节点中选择所述读写请求对应的代理节点;或者,所述中间件根据与所述中间件连接的代理节点运行状态,确定每个代理节点的权重,并根据所述权重确定所述读写请求对应的代理节点。
[0036]所谓轮询调度指的是假设中间件连接两个代理节点,那么中间件发来的第一个读写请求发送给第一个代理节点,第二个读写请求发送给第二个代理节点,然后第三个读写请求再发送给第一个代理节点,依次类推,这样就可以做到两个代理节点之间的负载均衡;当然,也可以预先根据每个代理节点运行的忙闲状态设定权重,权重小的证明代理节点较忙,权重大的证明代理节点处于空闲状态,这样,中间件就可以选择权重大的代理节点处理读写请求,因此也使得代理节点之间的负载做到均衡。
[0037]当代理节点确定之后,对应的代理节点根据读写请求中的数据主键值,也就是key找到对应的主服务器,因为每个主服务器中运行着多个实例,所以在根据key进行hash(哈希)运算找到对应的端口,进而根据确定的端口找到该条读写请求对应的Redis实例。
[0038]例如,图4所示,应用连接通用的中间件,中间件下面又连接两个代理节点,代理节点配合使用脚本监听Sentinal管控每个Redis服务器服务器,针对中间件来讲,可以包含四个功能部分,分别是负载均衡、连接池和连接链路四个部分。
[0039]其中,负载均衡功能指的是采用RoundRobin(轮询调度)和WeightedRoundRobin(权重轮询调度)两种负载策略对每个代理节点进行调度。连接池是是由中间件与代理节点之间进行通信的连接链路组成的,即连接池用于缓存中间件与代理节点之间的长连接。另外数据分片的功能则是由代理节点实现。
[0040]在这种部署结构中,对于中间件来说,中间件收到应用程序发来的读写请求,首先确定本条读写请求对应的哪个代理节点,当确定好代理节点之后,中间件从对应的连接池中选择一条连接链路,将读写请求传送给代理节点,代理节点再根据读写请求中的数据主键值确定本条读写请求对应的哪个Redis服务器,再根据数据主键值进行哈希运算生成的哈希值,确定对应的所述Red i s服务器的端口,并根据确定的端口确定所述读写请求对应的Redis实例。当确定好Redis实例之后,中间件从该Redis实例对应的连接池中获取一个长连接,这样就可以通过长连接发送该条读写请求了。
[0041]因为所述中间件为各代理节点设置有连接池,每个连接池中包括多个连接链路;进一步地,所述中间件向所述读写请求对应的代理节点的连接池中每条连接链路发送心跳检测;若心跳检测成功,则从所述代理节点对应的连接池中中获取可用的连接链路。也就是说,启动单独的线程定期地向代理节点对应的连接池中每条连接链路发送检测报文,根据其响应来判断其健康状态。若心跳检测成功,则证明对应的连接链路可用,因此可以从可用的连接链路中任意选择一条。
[0042]进一步地,所述中间件确定代理节点不可用时,停止向所述不可用的代理节点发送读写请求;检测所述不可用的代理节点对应的读写请求的执行状态,若执行完毕,则将所述不可用的代理节点删除。
[0043]可以理解的是,当代理节点不再可用时,与该代理节点连接的Redis服务器中的实例可能还在运行,此时,就需要监测该部分实例的运行状态,判断该部分实例中的读写请求处理完成时,再将该代理节点删除,就可以避免对正常的任务处理造成影响。
[0044]基于相同的技术构思,本发明实施例还提供一种Redis通用中间件的实现装置,该装置可执行上述方法实施例。本发明实施例提供的装置如图5所示,包括:接收单元401、确定单元402、处理单元403,其中:
[0045]接收单元401,用于接收应用发送的读写请求;
[0046]确定单元402,用于从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体;
[0047]处理单元403,用于从所述读写请求对应的处理实体的连接池中获取可用的连接链路,并通过所述连接链路发送所述读写请求。
[0048]进一步地,若与所述中间件连接的处理实体为Redis服务器;所述确定单元402具体用于:根据所述读写请求中的数据主键值,确定对应的Redi s服务器;根据所述数据主键值进行哈希运算生成的哈希值,确定对应的所述Redis服务器的端口 ;根据确定的端口确定所述读写请求对应的Red i s实例。
[0049]进一步地,所述处理单元403具体用于:向所述读写请求对应的Redis实例发送心跳检测;
[0050]若心跳检测成功,则从心跳检测成功的Redis实例对应的连接池中获取空闲的连接链路。
[0051 ]进一步地,若与所述中间件连接的处理实体为代理节点;
[0052]所述确定单元402具体用于:所述中间件根据各代理节点的工作状态,确定所述读写请求对应的代理节点;
[0053]所述处理单元403具体用于:所述读写请求对应的代理节点根据所述读写请求中的数据主键值,确定对应的Redis实例;所述读写请求对应的代理节点与所述Redis实例建立链路并将所述读写请求发送给所述对应的Redis实例。
[0054]进一步地,所述处理单元403具体用于:为各代理节点设置有连接池,每个连接池中包括多个连接链路;
[0055]向所述读写请求对应的代理节点的连接池中每条连接链路发送心跳检测;
[0056]若心跳检测成功,则从所述代理节点对应的连接池中中获取可用的连接链路。
[0057]进一步地,所述处理单元403还用于:确定代理节点不可用时,停止向不可用的代理节点发送读写请求;
[0058]检测所述不可用的代理节点对应的读写请求的执行状态,若执行完毕,则将所述不可用的代理节点删除。
[0059]进一步地,所述确定单元402具体用于:利用轮询调度从与所述中间件连接的代理节点中选择所述读写请求对应的代理节点;
[0060]或者,根据与所述中间件连接的代理节点运行状态,确定每个处理实体的权重,并根据所述权重确定所述读写请求对应的代理节点。
[0061]综上所述,本发明实施例通过一个通用的中间件实现现有应用访问Redis数据库的过程,即该中间件接收应用发送的读写请求,并从从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体,然后从所述读写请求对应的处理实体的连接池中获取可用的连接链路,并通过所述连接链路发送所述读写请求,因为中间件实现了现有应用访问Redis数据库的过程,其它应用通过调用中间件的接口既可以访问Redis数据库,而不需要进行额外的开发,使得这一访问Redis数据库的技术具有通用性,另外,通过心跳检测,获取可用的连接链路,也可以进一步地避免因代理节点或者Redis服务器发生故障造成的读写失败的问题。
[0062]本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0063]这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0064]这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0065]尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
[0066]显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
【主权项】
1.一种Redis通用中间件的实现方法,其特征在于,该方法包括: 中间件接收应用发送的读写请求; 所述中间件从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体;所述中间件从所述读写请求对应的处理实体的连接池中获取可用的连接链路,并通过所述连接链路发送所述读写请求。2.如权利要求1所述的方法,其特征在于,与所述中间件连接的处理实体为Redis服务器; 所述中间件从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体,包括: 根据所述读写请求中的数据主键值,确定对应的Redi s服务器; 根据所述数据主键值进行哈希运算生成的哈希值,确定对应的所述Redis服务器的端P; 根据确定的端口确定所述读写请求对应的Redis实例。3.如权利要求2所述的方法,其特征在于,所述中间件从所述读写请求对应的处理实体的连接池中获取可用的连接链路,包括: 向所述读写请求对应的Redis实例发送心跳检测; 若心跳检测成功,则从心跳检测成功的Redis实例对应的连接池中获取可用的连接链路。4.如权利要求1所述的方法,其特征在于,与所述中间件连接的处理实体为代理节点; 所述中间件从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体,包括: 所述中间件根据各代理节点的工作状态,确定所述读写请求对应的代理节点; 所述通过所述连接链路发送所述读写请求,包括: 所述读写请求对应的代理节点根据所述读写请求中的数据主键值,确定对应的Red i s实例; 所述读写请求对应的代理节点与所述Redi s实例建立链路并将所述读写请求发送给所述对应的Redis实例。5.如权利要求4所述的方法,其特征在于,所述中间件从所述读写请求对应的处理实体的连接池中获取可用的连接链路,包括: 所述中间件为各代理节点设置有连接池,每个连接池中包括多个连接链路; 所述中间件向所述读写请求对应的代理节点的连接池中每条连接链路发送心跳检测; 若心跳检测成功,则从所述代理节点对应的连接池中中获取可用的连接链路。6.如权利要求4所述的方法,其特征在于,还包括: 所述中间件确定代理节点不可用时,停止向不可用的代理节点发送读写请求; 检测所述不可用的代理节点对应的读写请求的执行状态,若执行完毕,则将所述不可用的代理节点删除。7.如权利要求4?6任一所述的方法,其特征在于,所述中间件从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体,包括: 所述中间件利用轮询调度从与所述中间件连接的代理节点中选择所述读写请求对应的代理节点; 或者,所述中间件根据与所述中间件连接的代理节点运行状态,确定每个代理节点的权重,并根据所述权重确定所述读写请求对应的代理节点。8.一种Redis通用中间件,其特征在于,包括: 接收单元,用于接收应用发送的读写请求; 确定单元,用于从与所述中间件连接的处理实体中确定所述读写请求对应的处理实体; 处理单元,用于从所述读写请求对应的处理实体的连接池中获取可用的连接链路,并通过所述连接链路发送所述读写请求。9.如权利要求8所述的中间件,其特征在于,与所述中间件连接的处理实体为Redis月艮务器; 所述确定单元具体用于:根据所述读写请求中的数据主键值,确定对应的Redis服务器; 根据所述数据主键值进行哈希运算生成的哈希值,确定对应的所述Redis服务器的端P; 根据确定的端口确定所述读写请求对应的Redis实例。10.如权利要求9所述的中间件,其特征在于,所述处理单元具体用于: 向所述读写请求对应的Redis实例发送心跳检测; 若心跳检测成功,则从心跳检测成功的Redis实例对应的连接池中获取空闲的连接链路。11.如权利要求8所述的中间件,其特征在于,与所述中间件连接的处理实体为代理节占.V , 所述确定单元具体用于:所述中间件根据各代理节点的工作状态,确定所述读写请求对应的代理节点; 所述读写请求对应的代理节点根据所述读写请求中的数据主键值,确定对应的Red i s实例;所述读写请求对应的代理节点与所述Redi s实例建立链路并将所述读写请求发送给所述对应的Redis实例。12.如权利要求11所述的中间件,其特征在于,所述处理单元具体用于: 为各代理节点设置有连接池,每个连接池中包括多个连接链路; 向所述读写请求对应的代理节点的连接池中每条连接链路发送心跳检测; 若心跳检测成功,则从所述代理节点对应的连接池中中获取可用的连接链路。13.如权利要求11所述的中间件,其特征在于,所述处理单元还用于: 确定代理节点不可用时,停止向不可用的代理节点发送读写请求; 检测所述不可用的代理节点对应的读写请求的执行状态,若执行完毕,则将所述不可用的代理节点删除。14.如权利要求11?13任一项所述的中间件,其特征在于,所述确定单元具体用于: 利用轮询调度从与所述中间件连接的代理节点中选择所述读写请求对应的代理节点;或者,根据与所述中间件连接的代理节点运行状态,确定每个代理节点的权重,并根据所述权重确定所述读写请求对应的代理节点。
【文档编号】H04L29/08GK105933408SQ201610248474
【公开日】2016年9月7日
【申请日】2016年4月20日
【发明人】孙黎明
【申请人】中国银联股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1