CN114281410A - 一种Redis集群代理模式的指令响应方法、装置及电子设备 - Google Patents
一种Redis集群代理模式的指令响应方法、装置及电子设备 Download PDFInfo
- Publication number
- CN114281410A CN114281410A CN202111403198.4A CN202111403198A CN114281410A CN 114281410 A CN114281410 A CN 114281410A CN 202111403198 A CN202111403198 A CN 202111403198A CN 114281410 A CN114281410 A CN 114281410A
- Authority
- CN
- China
- Prior art keywords
- target
- instruction
- redis
- node
- channel
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Information Transfer Between Computers (AREA)
Abstract
本发明实施例提供了一种Redis集群代理模式的指令响应方法、装置及电子设备,涉及计算机技术领域。具体实现方案为:当接收到任一客户端发送的针对发布订阅机制的目标指令时,确定所述目标指令所指示的目标频道;查找所述目标频道所位于的目标Redis节点;通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令,以使所述目标Redis节点在接收到所述目标指令后,执行与所述目标指令对应的操作。从而,通过本方案可以实现在Redis集群代理模式下,关于发布订阅机制的指令响应。
Description
技术领域
本发明涉及计算机技术领域,特别是涉及一种Redis集群代理模式的指令响应方法、装置及电子设备。
背景技术
Redis(Remote Dictionary Server,远程字典服务)是非关系型数据库,属于键值对数据库存储系统。
其中,Redis的发布订阅(pub/sub)机制包括三个部分:发布者,订阅者和Channel(频道)。其中,发布者和订阅者都是客户端,Channel则为Redis服务器端,具体而言,发布者将消息发送到某个频道,订阅该频道的订阅者,可以接收到这条消息。
随着互联网技术的发展,利用Codis(分布式Redis解决方案)来管理Redis分布式集群的集群代理模式越来越受欢迎,Codis起着一个中间代理的作用,对于上层的应用来说,连接到Codis-Proxy(代理节点)和连接原生的Redis节点没有明显的区别。
那么,在Redis集群代理模式下下,如何实现关于发布订阅机制的指令响应,是一个亟待解决的问题。
发明内容
本发明实施例的目的在于提供一种Redis集群代理模式的指令响应方法、装置及电子设备,以实现在Redis集群代理模式下,关于发布订阅机制的指令响应。具体技术方案如下:
第一方面,本发明实施例提供了一种Redis集群代理模式的指令响应方法,应用于代理节点,所述代理节点分别与客户端以及各个Redis节点相通信;所述方法包括:
当接收到任一客户端发送的针对发布订阅机制的目标指令时,确定所述目标指令所指示的目标频道;
查找所述目标频道所位于的目标Redis节点;
通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令,以使所述目标Redis节点在接收到所述目标指令后,执行与所述目标指令对应的操作。
可选地,所述查找所述目标频道所位于的目标Redis节点,包括:对所述目标频道的键进行哈希计算,得到目标槽位值;
从预先建立的关于各个槽位值与Redis节点之间的映射关系中,确定所述目标槽位值对应的Redis节点,作为目标Redis节点;
其中,所述映射关系中,任一槽位值对应的Redis节点为存在该槽位值对应的频道的节点,该槽位值对应的频道为对键进行哈希能够得到该槽位值的频道。
可选地,所述目标Redis节点执行与所述目标指令对应的操作,包括:
若所述目标指令为订阅指令,则为发送所述目标指令的客户端订阅所述目标频道;
若所述目标指令为消息发布指令,则向已订阅所述目标频道的客户端,发布所述消息发布指令中携带的消息;
若所述目标指令为取消订阅指令,则针对发送所述目标指令的客户端,取消关于所述目标频道的订阅。
可选地,所述方法还包括:
接收所述目标Redis节点反馈的针对所述目标指令的操作结果;
在接收到所述操作结果后,将所述操作结果传输至发送所述目标指令的客户端。
可选地,通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令之前,所述方法还包括:
检测与所述目标Redis节点之间是否存在具有指定状态的私有连接;
若不存在,建立所述代理节点与所述目标Redis节点之间的私有连接,并将所建立的私有连接设置为指定状态。
第二方面,本发明实施例提供了一种Redis集群代理模式的指令响应装置,应用于代理节点,所述代理节点分别与客户端以及各个Redis节点相通信;所述装置包括:
接收模块,用于当接收到任一客户端发送的针对发布订阅机制的目标指令时,确定所述目标指令所指示的目标频道;
查找模块,用于查找所述目标频道所位于的目标Redis节点;
发送模块,用于通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令,以使所述目标Redis节点在接收到所述目标指令后,执行与所述目标指令对应的操作。
可选地,所述查找模块,包括:
计算子模块,用于对所述目标频道的键进行哈希计算,得到目标槽位值;
确定子模块,用于从预先建立的关于各个槽位值与Redis节点之间的映射关系中,确定所述目标槽位值对应的Redis节点,作为目标Redis节点;
其中,所述映射关系中,任一槽位值对应的Redis节点为存在该槽位值对应的频道的节点,该槽位值对应的频道为对键进行哈希能够得到该槽位值的频道。
可选地,所述目标Redis节点执行与所述目标指令对应的操作,包括:
若所述目标指令为订阅指令,则为发送所述目标指令的客户端订阅所述目标频道;
若所述目标指令为消息发布指令,则向已订阅所述目标频道的客户端,发布所述消息发布指令中携带的消息;
若所述目标指令为取消订阅指令,则针对发送所述目标指令的客户端,取消关于所述目标频道的订阅。
可选地,所述装置还包括:
反馈模块,用于接收所述目标Redis节点反馈的针对所述目标指令的操作结果;
传输模块,用于在接收到所述操作结果后,将所述操作结果传输至发送所述目标指令的客户端。
可选地,所述装置还包括:
检测模块,用于在所述发送模块执行通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令之前,检测与所述目标Redis节点之间是否存在具有指定状态的私有连接;
建立模块,用于若不存在,建立所述代理节点与所述目标Redis节点之间的私有连接,并将所建立的私有连接设置为指定状态。
第三方面,本发明实施例提供了一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
存储器,用于存放计算机程序;
处理器,用于执行存储器上所存放的程序时,实现上述任一所述的Redis集群代理模式的指令响应方法的步骤。
第四方面,本发明实施例提供了一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述任一所述的Redis集群代理模式的指令响应方法的步骤。
第五方面,本发明实施例还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述任一所述的Redis集群代理模式的指令响应方法的步骤。
本发明实施例有益效果:
可见,本方案中,针对发布订阅机制的目标指令,考虑集群代理模式的特性,代理节点首先查找目标指令所指示的目标频道所位于的目标Redis节点,然后通过与目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令,从而目标Redis节点执行与所述目标指令对应的操作。因此,通过本方案可以实现在Redis集群代理模式下,关于发布订阅机制的指令响应。
当然,实施本发明的任一产品或方法并不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的实施例。
图1为本发明实施例所提供的一种Redis集群代理模式的架构图;
图2为本发明实施例所提供的一种Redis集群代理模式的指令响应方法的流程图;
图3为本发明实施例所提供的一种Redis集群代理模式的指令响应方法的另一流程图;
图4为本发明实施例所提供的一种Redis集群代理模式的指令响应方法的又一流程图;
图5为本发明实施例所提供的一种Redis集群代理模式的指令响应装置的结构示意图;
图6为本发明实施例所提供的一种电子设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员基于本申请所获得的所有其他实施例,都属于本发明保护的范围。
相关技术中,在Redis的发布订阅机制中,当客户端订阅某个频道时,Redis节点需要将该频道和订阅该频道的客户端进行绑定,以使订阅该频道的客户端可以接收到通过该频道发布的消息。当客户端向某个频道发送消息时,Redis首先在结构体Redis-Server(Redis服务,即Redis节点)中的pubsub_channels(发布订阅频道)字典中找出键为该频道的结点,遍历该结点的值,即遍历订阅了该频道的所有客户端,然后将消息发送给这些客户端。
随着互联网技术的发展,利用Codis来管理Redis分布式集群的集群代理模式越来越受欢迎。Codis是一个分布式Redis解决方案,对于上层的客户端来说,连接到Codis-Proxy和连接原生的Redis-Server没有明显的区别,Codis底层会处理请求的转发、不停机的数据迁移等工作。所有后边的一切事情,对于前面的客户端来说是透明的,可以简单的认为后边连接的是一个内存无限大的Redis服务。但是,Codis中并没有对发布、订阅、取消订阅、模式订阅和取消模式订阅等相关指令的支持,导致用户在这种集群代理模式下,无法实现关于发布订阅机制的指令响应。
基于上述内容,为了在Redis集群代理模式下,实现关于发布订阅机制的指令响应,本发明实施例提供了一种Redis集群代理模式的指令响应方法、装置及电子设备。
下面,首先对本发明实施例所提供的一种Redis集群代理模式的指令响应方法进行介绍。
本发明实施例所提供的一种Redis集群代理模式的指令响应方法应用于代理节点,该代理节点与分别与客户端以及各个Redis节点相通信。其中,代理节点最主要的作用为接收客户端提交的redis命令,并将命令分发到后端Redis-Server集群,再收集各命令的执行结果,最终将执行结果返回给客户端。在具体应用中,如图1所示,客户端通过vip(Virtual IP,虚拟IP)访问每个Codis-Proxy,通过Codis-Proxy把请求转发至后端Redis-Server处理。
并且,对于用户发布订阅场景,客户端作为用户发布消息和/或订阅消息的媒介,与发布订阅服务器进行通信。客户端可以是发布者身份和/或订阅者身份,通过频道发布和/或订阅消息。作为发布者的客户端,可以向多个频道发布消息;作为订阅者的客户端,可以订阅多个频道,接收来自这些频道的消息。
在表示客户端的结构体client中,有一个属性为pubsub_channels,该属性表明了该客户端订阅的所有频道,它是一个字典类型,通过哈希表实现,其中的每个元素都包含了一个键值对以及指向下一个元素的指针,每次订阅都要向其中插入一个结点,键表示订阅的频道,值为空。然后,在表示服务器端的结构体Redis-Server中,也有一个属性为pubsub_channels,但此处它表示的是该服务器端中的所有频道以及订阅了这个频道的客户端,它也是一个字典类型,插入结点时,键表示频道,值则是订阅了这个频道的所有客户端组成的链表。
其中,本发明实施例所提供的一种Redis集群代理模式的指令响应方法,可以包括如下步骤:
当接收到任一客户端发送的针对发布订阅机制的目标指令时,确定所述目标指令所指示的目标频道;
查找所述目标频道所位于的目标Redis节点;
通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令,以使所述目标Redis节点在接收到所述目标指令后,执行与所述目标指令对应的操作。
本发明实施例所提供的方案中,针对发布订阅机制的目标指令,考虑集群代理模式的特性,代理节点首先查找目标指令所指示的目标频道所位于的目标Redis节点,然后通过与目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令,从而目标Redis节点执行与所述目标指令对应的操作。因此,通过本方案可以实现在Redis集群代理模式下,关于发布订阅机制的指令响应。
下面结合附图,对本发明实施例所提供的Redis集群代理模式的指令响应方法进行介绍。
如图2所示,本发明实施例所提供的一种Redis集群代理模式的指令响应方法,可以包括如下步骤:
S201,当接收到任一客户端发送的针对发布订阅机制的目标指令时,确定所述目标指令所指示的目标频道;
本实施例中,针对发布订阅机制的目标指令可以包括:订阅(subscribe)指令、取消订阅(unsubscribe)指令、消息发布(publish)指令、模式订阅(psubscribe)指令和取消模式订阅(punsubscribe)指令,等等。其中,订阅指令用于为客户端订阅频道;取消订阅指令用于为客户端取消已订阅的频道;消息发布指令用于通过频道向订阅了该频道的客户端发布消息;模式订阅指令用于根据订阅的模式,为客户端筛选出与该模式匹配的频道进行订阅;取消模式订阅指令用于根据取消订阅的模式,为客户端筛选出与该模式匹配的频道进行取消订阅。需要说明的是,从广义上讲,模式订阅指令也可以属于订阅指令,即对于一类频道进行订阅的指令。
需要说明的是,模式匹配功能允许客户端订阅符合某个模式的频道,Redis采用psubscribe模式订阅指令订阅符合某个模式所有频道,用“*”表示模式,“*”可以被任意值代替。
其中,确定所述目标指令所指示的目标频道的方式可以包括:根据该指令中携带的参数,确定所述目标指令所指示的目标频道。示例性的,若所述指令为“subscirbemongo”,则该指令为订阅指令,所指示的目标频道为mongo;示例性的,若所述指令为“psubscirbe b*”,则该指令为模式订阅指令,所指示的目标频道为与“b*”相匹配的所有频道,例如:bK、bn等所有以b开头的频道。
S202,查找所述目标频道所位于的目标Redis节点;
可以理解的是,由于在Codis中存在多个redis节点,每个redis节点中可以存在至少一个频道,因此,在通过步骤S201确定了所述目标指令所指示的目标频道后,需要查找所述目标频道所位于的目标Redis节点,以将接收到的目标指令发送至目标频道所位于的目标Redis节点,使得目标Redis节点可以执行关于目标频道的相关操作。其中,不同的频道可以代表不同的消息类型。redis将消息类型称为通道,即频道。当发布者经过publish命令向Redis-Server发送特定类型的消息时,订阅该消息类型的所有client都会收到此消息。
可选地,在一种实现方式中,所述查找所述目标频道所位于的目标Redis节点,包括步骤A1-A2:
A1,对所述目标频道的键进行哈希计算,得到目标槽位值;
在Codis中,槽位的个数可以根据Redis节点的数量进行设置,例如设置成1024、2048或者是4096个。由于在Codis在内存中维护着槽位值与Redis节点的映射关系,哪个槽位值由哪个redis节点管理,是在redis集群启动后就已经确定的,因此,为了找到目标频道所位于的Redis节点,可以先计算出目标槽位值。由于Redis数据库中的数据以键值对的形式进行存储,在表示客户端的结构体client中,属性为pubsub_channels的字典中记录了该客户端订阅的所有频道,键表示订阅的频道,值为空。因此,对目标频道的键进行哈希计算可以是获取属性为pubsub_channels的字典中目标频道的键值,然后对该键值进行哈希计算。
示例性的,若codis中有16384个槽位,这些槽位会分布在所有redis节点中,对目标频道的键进行哈希计算,也就是通过执行crc16算法,再对16384取余,即可得到一个小于16384的数,该结果就是槽位值。
A2,从预先建立的关于各个槽位值与Redis节点之间的映射关系中,确定所述目标槽位值对应的Redis节点,作为目标Redis节点;其中,所述映射关系中,任一槽位值对应的Redis节点为存在该槽位值对应的频道的节点,该槽位值对应的频道为对键进行哈希能够得到该槽位值的频道。
由于Codis是一个代理中间件,通过内存保存着槽位值和Redis节点之间的映射关系,因此,在通过步骤A1计算出目标槽位值后,根据该槽位值和Redis节点之间的映射关系,即可确定目标Redis节点,该目标Redis节点即为目标频道所位于的节点。
S203,通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令,以使所述目标Redis节点在接收到所述目标指令后,执行与所述目标指令对应的操作。
其中,所述私有连接为代理节点与Redis节点之间的关于发布订阅指令的独立的通信连接,指定状态为针对发布订阅指令的私有连接建立后,所处于的发布订阅状态。代理节点在查找到目标频道所位于的目标Redis节点后,通过与所述目标Redis节点之间的具有指定状态的私有连接,可以将目标指令通过私有连接转发至目标Redis节点,以使目标Redis节点可以执行与所述目标指令对应的操作。
另外,需要说明的是,目标指令所指示的目标频道的个数可以是一个也可以是多个,这都是合理的。若目标指令所指示的目标频道个数为多个,代理节点在接收到客户端发送的目标指令后,会计算针对各个目标频道的槽位值,从而获得多个目标频道所位于的多个目标Redis节点。此时,若多个目标频道所位于的多个目标Redis节点不同,在通过与各个目标Redis节点之间的私有连接向各个目标Redis节点发送所述目标指令时,会将所述目标指令根据不同频道进行拆分,以使各个目标Redis节点可以为客户端订阅相应的目标频道。
示例性的,若所述目标指令为“subscirbe mongo redis”,则会对目标频道“mongo”和“redis”的键进行哈希计算,得到槽位值。如果值不同,会拆分成2条指令路由至服务器端不同的目标redis节点中,拆分的指令如:“subscribe mongo”、“subscriberedis”,以使目标频道“mongo”所位于的目标Redis节点可以接受到订阅指令“subscribemongo”,从而为客户端订阅目标频道mongo;目标频道“redis”所位于的目标Redis节点可以接受到订阅指令“subscribe redis”,从而为客户端订阅目标频道redis。
其中,所述目标Redis节点执行与所述目标指令对应的操作,包括步骤B1-B3:
B1,若所述目标指令为订阅指令,则为发送所述目标指令的客户端订阅所述目标频道;
示例性的,为发送所述目标指令的客户端订阅所述目标频道的方式可以包括:向目标redis节点中属性为pubsub_channels的字典中,插入一个节点,键表示频道,值是订阅这个频道的客户端。从而,实现目标频道和发送所述目标指令的客户端之间的绑定,即为发送所述目标指令的客户端订阅了所述目标频道。
B2,若所述目标指令为消息发布指令,则向已订阅所述目标频道的客户端,发布所述消息发布指令中携带的消息;
示例性的,向已订阅所述目标频道的客户端,发布所述消息发布指令中携带的消息的方式可以包括:在查找到目标频道所位于的目标redis节点后,首先在目标Redis节点中属性为pubsub_channels的字典中找出键为所述目标频道的结点,遍历该结点的值,即遍历订阅了该目标频道的所有客户端,然后将消息发布指令中携带的消息发送给这些客户端。
B3,若所述目标指令为取消订阅指令,则针对发送所述目标指令的客户端,取消关于所述目标频道的订阅。
示例性的,针对发送所述目标指令的客户端,取消关于所述目标频道的订阅的方式可以包括:在目标redis节点中属性为pubsub_channels的字典中,删除键为所述目标频道、值为发送所述目标指令的客户端的结点。从而,实现目标频道和发送所述目标指令的客户端之间的解绑,即为发送所述目标指令的客户端取消了关于所述目标频道的订阅。
另外,所述目标指令还可以是模式订阅指令和取消模式订阅指令,当所述目标指令时模式订阅指令时,执行的操作与步骤B1中订阅指令执行的操作类似;当所述目标指令为取消模式订阅指令时,执行的操作与步骤B3中取消订阅指令执行的操作类似;区别在于:通过遍历属性为pubsub_patterns(发布订阅模式)的字典中包含频道的模式的结点,实现批量的目标频道的订阅和取消订阅,即模式订阅和取消模式订阅。这里不再赘述。
本发明实施例所提供的方案中,针对发布订阅机制的目标指令,考虑集群代理模式的特性,代理节点首先查找目标指令所指示的目标频道所位于的目标Redis节点,然后通过与目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令,从而目标Redis节点执行与所述目标指令对应的操作。因此,通过本方案可以实现在Redis集群代理模式下,关于发布订阅机制的指令响应。
可选地,在本发明的另一实施例中,在图2实施例的基础上,如图3所示,所述方法还包括步骤S301-S302:
S301,接收所述目标Redis节点反馈的针对所述目标指令的操作结果;
可以理解的是,在目标Redis节点执行与所述目标指令对应的操作后,可以将操作结果反馈给发送所述目标指令的客户端,以通知该客户端相关指令是否执行成功。其中,所述操作结果中可以包括已订阅的频道名称、频道数量等信息。
示例性的,若所述目标指令为订阅指令,在目标Redis节点执行为发送目标指令的客户端,订阅目标指令所指示的目标频道后,所述目标Redis节点通过与代理节点之间的私有连接向所述代理节点反馈订阅的操作结果。其中,代理节点接收到的操作结果中,包括当前已订阅的频道名称和频道数量。
示例性的,若所述目标指令为取消订阅指令,在目标Redis节点执行为发送目标指令的客户端,取消订阅目标指令所指示的目标频道后,所述目标Redis节点通过与代理节点之间的私有连接向所述代理节点反馈取消订阅的操作结果。其中,代理节点接收到的操作结果中,包括当前已订阅的频道名称和频道数量。
示例性的,若所述目标指令为消息发布指令,在目标Redis节点执行向已订阅所述目标频道的客户端,发布所述消息发布指令中携带的消息后,所述目标Redis节点通过与代理节点之间的私有连接向所述代理节点反馈消息发布的操作结果。代理节点接收到的操作结果中,包括接收到该消息的订阅者的客户端名称和数量。
S302,在接收到所述操作结果后,将所述操作结果传输至发送所述目标指令的客户端。
可以理解的是,代理节点在接收到目标redis节点反馈的针对所述目标指令的操作结果后,通过将所述结果传输至发送所述目标指令的客户端,可以使得通过操作该客户端发送发布订阅相关指令的用户可以查看到操作结果,从而获知相关指令的执行情况。
另外,客户端在接收到代理节点发送的操作结果后,还可以在客户端中记录相关的订阅操作的结果。
示例性的,若所述目标指令为订阅指令,客户端在接收到目标redis节点为该客户端成功订阅目标频道的消息后,向本地属性为pubsub_channels的字典中,插入一个结点(键值对),键表示订阅的频道,值为空。从而,实现客户端和目标频道之间的绑定,便于后续接收该目标频道发布的消息。
示例性的,若所述目标指令为取消订阅指令,客户端在接收到目标redis节点为该客户端成功取消订阅目标频道的消息后,查找发送所述目标指令的客户端中属性为pubsub_channels的字典中,键为所述目标频道的结点进行删除。从而,实现客户端和目标频道之间的解绑,后续不再接收该目标频道发布的消息。
可见,通过本实施例方案,在目标redis节点执行与所述目标指令对应的操作后,将针对所述目标指令的操作结果,通过代理节点反馈给发送所述目标指令的客户端,可以使得操作该客户端发送所述目标指令的用户,查看到相应的操作结果,以获知所述目标指令的执行情况。
可选地,在本发明的另一实施例中,如图4所示,所述通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令之前,所述方法还包括步骤S401-S402:
S401,检测与所述目标Redis节点之间是否存在具有指定状态的私有连接;
本实施例中,所述指定状态为针对发布订阅指令的私有连接建立后,所处于的发布订阅状态。由于Redis的订阅操作是阻塞式的,因此一旦客户端通过代理节点订阅了某个频道或模式,代理节点与目标redis节点之间的私有连接就会一直处于发布订阅状态直到退出。
当代理节点与目标redis节点之间存在具有发布订阅状态的私有连接时,代理节点才可以通过该私有连接向目标redis节点发送目标指令。因此,在代理节点向目标Redis节点发送所述目标指令之前,可以检测与所述目标Redis节点之间是否存在具有指定状态的私有连接。
示例性的,检测代理节点与所述目标Redis节点之间是否存在具有指定状态的私有连接的方式,可以是查找该私有连接的session_flag(会话标记),若该会话标记的状态为发布订阅状态,则代理节点与所述目标Redis节点之间具有指定状态的私有连接。
S402,若不存在,建立代理节点与所述目标Redis节点之间的私有连接,并将所建立的私有连接设置为指定状态。
若代理节点与目标redis之间不存在具有指定状态的私有连接,需要建立代理节点与所述目标Redis节点之间的私有连接,该私有连接为特殊指令,即发布订阅指令独立使用的连接。在私有连接建立后,将所建立的私有连接设置为指定状态,以在后续接收到客户端发送的发布订阅指令时,可以通过代理节点与目标redis节点之间的具有指定状态的私有连接,向目标Redis节点发送所述目标指令。
示例性的,将所建立的私有连接设置为指定状态的方式可以是,在建立代理节点与所述目标Redis节点之间的私有连接后,创建一个session(会话),设置该私有连接的session_flag(会话标志)为发布订阅状态,即实现将所建立的私有连接设置为指定状态。
另外,session还会记录通过该私有连接订阅的频道名称和频道数量。当通过该私有连接订阅的频道数量变为0时,该私有连接会关闭。
可见,通过本实施例提供的方案,可以确保代理节点可通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令,从而,为关于发布订阅机制的指令的响应提供了实现基础。
为了更好的阐述本发明实施例的内容,下面结合五个具体的示例对Redis集群代理模式的指令响应方法的响应流程进行介绍。
示例一:代理节点接收到客户端发送的订阅指令“subscribe redis mongo”,处理如下:
1、根据订阅指令所指示的频道redis和频道mongo,分别对频道redis和频道mongo的键进行哈希计算,得到相应的槽位值,从而根据槽位值与redis节点之间的映射关系,查找到频道redis和频道mongo所在的redis节点。若两频道所位于的redis节点相同,则建立与频道redis和频道mongo所在的redis节点之间的私有连接。
若两频道所位于的redis节点不同,将订阅指令拆分为:“subscribe mongo”、“subscribe redis”,然后,分别与各频道所位于的redis节点建立私有连接。以使频道mongo所位于的Redis节点可以接受到订阅指令“subscribe mongo”,从而为客户端订阅频道mongo;频道“redis”所位于的Redis节点可以接受到订阅指令“subscribe redis”,从而为客户端订阅频道redis。
在建立私有连接后,创建一个session,标记该私有连接的session_flag为发布订阅状态,通过该私有连接将订阅指令或拆分后的订阅指令发送至相应的redis节点。
2、以频道redis和频道mongo位于相同的redis节点为例,前述redis节点在执行完订阅指令后,向客户端返回结果:
“subscribe”
“redis”
(integer)1
“subscribe”
“mongo”
(integer)2
其中,integer(整数)后的数字表示当前订阅的频道数量。若返回的结果中存在失败的情况,则关闭私有连接;否则,session中对订阅的频道名称和频道数量进行记录,当session中记录的频道数量为0时,关闭私有连接。
示例二:在示例一的基础上,代理节点接收到客户端发送的取消订阅指令“unsubscribe redis”,处理如下:
1、判断session_flag是否为发布订阅状态。
2、若是,代理节点通过上述私有连接将取消订阅指令发送给频道redis所在的redis节点,以使前述redis节点在执行完取消订阅指令后,向客户端返回结果:
“unsubscribe”
“redis”
(integer)1
示例三:在示例一的基础上,代理节点接收到客户端发送的取消订阅指令“unsubscribe”,处理如下:
1、判断session_flag是否为发布订阅状态。
2、若是,由于取消订阅指令中没有指示的频道,此时根据session中缓存的频道名称,即“redis”、“mongo”,计算各个频道的键的槽位值,通过各个槽位值查找到各个频道所位于的redis节点,然后,将取消订阅指令转发至各个频道所位于的redis节点。
3、各个redis节点在执行完取消订阅指令后,向客户端返回结果:
“unsubscribe”
“redis”
(integer)1
“unsubscribe”
“mongo”
(integer)0
此时,session中记录的频道数量为0,关闭私有连接,session_flag标志解除。
示例四:在示例一的基础上,代理节点接收到客户端发送的取消订阅指令“unsubscribe redis kk mongo”,处理如下:
1、判断session_flag是否为发布订阅状态。
2、若是,代理节点通过上述私有连接将取消订阅指令发送给频道redis、频道kk和频道mongo所在的redis节点,以使前述redis节点在执行完取消订阅指令后,向客户端返回结果:
“unsubscribe”
“redis”
(integer)1
“unsubscribe”
“kk”
(integer)1
“unsubscribe”
“mongo”
(integer)0
可以理解的是,由于当前session中,并没有订阅频道kk,因此,在执行指令“unsubscribe kk”后,订阅的频道数量并没有发生变化。当session中记录的频道数量为0时,关闭私有连接,session_flag标志解除。
示例五:在示例一的基础上,代理节点接收到客户端发送的消息发布指令“publish redis hello”,处理如下:
1、代理节点定时获取所有客户端订阅的频道和模式频道的信息。
2、将所有客户端订阅的频道和模式频道的信息,与消息发布指令所指示的频道进行匹配,以查找到订阅了频道redis的所有客户端。
3、代理节点通过频道redis所位于的redis节点,向订阅了频道redis的所有客户端,发布消息“hello”,并向发送消息发布指令的客户端返回接收到该消息的客户端名称和数量。
可见,通过本方案,可以实现在Redis集群代理模式下,关于发布订阅机制的指令响应。
相应上述方法实施例,本发明实施例还提供了一种Redis集群代理模式的指令响应装置,应用于代理节点,所述代理节点分别与客户端以及各个Redis节点相通信;如图5所示,所述装置包括:
接收模块510,用于当接收到任一客户端发送的针对发布订阅机制的目标指令时,确定所述目标指令所指示的目标频道;
查找模块520,用于查找所述目标频道所位于的目标Redis节点;
发送模块530,用于通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令,以使所述目标Redis节点在接收到所述目标指令后,执行与所述目标指令对应的操作。
可选地,所述查找模块,包括:
计算子模块,用于对所述目标频道的键进行哈希计算,得到目标槽位值;
确定子模块,用于从预先建立的关于各个槽位值与Redis节点之间的映射关系中,确定所述目标槽位值对应的Redis节点,作为目标Redis节点;
其中,所述映射关系中,任一槽位值对应的Redis节点为存在该槽位值对应的频道的节点,该槽位值对应的频道为对键进行哈希能够得到该槽位值的频道。
可选地,所述目标Redis节点执行与所述目标指令对应的操作,包括:
若所述目标指令为订阅指令,则为发送所述目标指令的客户端订阅所述目标频道;
若所述目标指令为消息发布指令,则向已订阅所述目标频道的客户端,发布所述消息发布指令中携带的消息;
若所述目标指令为取消订阅指令,则针对发送所述目标指令的客户端,取消关于所述目标频道的订阅。
可选地,所述装置还包括:
反馈模块,用于接收所述目标Redis节点反馈的针对所述目标指令的操作结果;
传输模块,用于在接收到所述操作结果后,将所述操作结果传输至发送所述目标指令的客户端。
可选地,所述装置还包括:
检测模块,用于在所述发送模块执行通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令之前,检测与所述目标Redis节点之间是否存在具有指定状态的私有连接;
建立模块,用于若不存在,建立所述代理节点与所述目标Redis节点之间的私有连接,并将所建立的私有连接设置为指定状态。
本发明实施例还提供了一种电子设备,如图6所示,包括处理器601、通信接口602、存储器603和通信总线604,其中,处理器601,通信接口602,存储器603通过通信总线604完成相互间的通信,
存储器603,用于存放计算机程序;
处理器601,用于执行存储器603上所存放的程序时,实现本发明实施例上述所提供的任一Redis集群代理模式的指令响应方法的步骤。
上述电子设备提到的通信总线可以是外设部件互连标准(Peripheral ComponentInterconnect,PCI)总线或扩展工业标准结构(Extended Industry StandardArchitecture,EISA)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
通信接口用于上述电子设备与其他设备之间的通信。
存储器可以包括随机存取存储器(Random Access Memory,RAM),也可以包括非易失性存储器(Non-Volatile Memory,NVM),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。
上述的处理器可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(Digital SignalProcessor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
在本发明提供的又一实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述任一Redis集群代理模式的指令响应方法的步骤。
在本发明提供的又一实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述实施例中任一Redis集群代理模式的指令响应方法。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘Solid State Disk(SSD))等。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本发明的较佳实施例,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
Claims (12)
1.一种Redis集群代理模式的指令响应方法,其特征在于,应用于代理节点,所述代理节点分别与客户端以及各个Redis节点相通信;所述方法包括:
当接收到任一客户端发送的针对发布订阅机制的目标指令时,确定所述目标指令所指示的目标频道;
查找所述目标频道所位于的目标Redis节点;
通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令,以使所述目标Redis节点在接收到所述目标指令后,执行与所述目标指令对应的操作。
2.根据权利要求1所述的方法,其特征在于,所述查找所述目标频道所位于的目标Redis节点,包括:
对所述目标频道的键进行哈希计算,得到目标槽位值;
从预先建立的关于各个槽位值与Redis节点之间的映射关系中,确定所述目标槽位值对应的Redis节点,作为目标Redis节点;
其中,所述映射关系中,任一槽位值对应的Redis节点为存在该槽位值对应的频道的节点,该槽位值对应的频道为对键进行哈希能够得到该槽位值的频道。
3.根据权利要求1或2所述的方法,其特征在于,所述目标Redis节点执行与所述目标指令对应的操作,包括:
若所述目标指令为订阅指令,则为发送所述目标指令的客户端订阅所述目标频道;
若所述目标指令为消息发布指令,则向已订阅所述目标频道的客户端,发布所述消息发布指令中携带的消息;
若所述目标指令为取消订阅指令,则针对发送所述目标指令的客户端,取消关于所述目标频道的订阅。
4.根据权利要求1或2所述的方法,其特征在于,所述方法还包括:
接收所述目标Redis节点反馈的针对所述目标指令的操作结果;
在接收到所述操作结果后,将所述操作结果传输至发送所述目标指令的客户端。
5.根据权利要求1或2所述的方法,其特征在于,通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令之前,所述方法还包括:
检测与所述目标Redis节点之间是否存在具有指定状态的私有连接;
若不存在,建立所述代理节点与所述目标Redis节点之间的私有连接,并将所建立的私有连接设置为指定状态。
6.一种Redis集群代理模式的指令响应装置,其特征在于,应用于代理节点,所述代理节点分别与客户端以及各个Redis节点相通信;所述装置包括:
接收模块,用于当接收到任一客户端发送的针对发布订阅机制的目标指令时,确定所述目标指令所指示的目标频道;
查找模块,用于查找所述目标频道所位于的目标Redis节点;
发送模块,用于通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令,以使所述目标Redis节点在接收到所述目标指令后,执行与所述目标指令对应的操作。
7.根据权利要求6所述的装置,其特征在于,所述查找模块,包括:
计算子模块,用于对所述目标频道的键进行哈希计算,得到目标槽位值;
确定子模块,用于从预先建立的关于各个槽位值与Redis节点之间的映射关系中,确定所述目标槽位值对应的Redis节点,作为目标Redis节点;
其中,所述映射关系中,任一槽位值对应的Redis节点为存在该槽位值对应的频道的节点,该槽位值对应的频道为对键进行哈希能够得到该槽位值的频道。
8.根据权利要求6或7所述的装置,其特征在于,所述目标Redis节点执行与所述目标指令对应的操作,包括:
若所述目标指令为订阅指令,则为发送所述目标指令的客户端订阅所述目标频道;
若所述目标指令为消息发布指令,则向已订阅所述目标频道的客户端,发布所述消息发布指令中携带的消息;
若所述目标指令为取消订阅指令,则针对发送所述目标指令的客户端,取消关于所述目标频道的订阅。
9.根据权利要求6或7所述的装置,其特征在于,所述装置还包括:
反馈模块,用于接收所述目标Redis节点反馈的针对所述目标指令的操作结果;
传输模块,用于在接收到所述操作结果后,将所述操作结果传输至发送所述目标指令的客户端。
10.根据权利要求6或7所述的装置,其特征在于,所述装置还包括:
检测模块,用于在所述发送模块执行通过与所述目标Redis节点之间的具有指定状态的私有连接,向所述目标Redis节点发送所述目标指令之前,检测与所述目标Redis节点之间是否存在具有指定状态的私有连接;
建立模块,用于若不存在,建立所述代理节点与所述目标Redis节点之间的私有连接,并将所建立的私有连接设置为指定状态。
11.一种电子设备,其特征在于,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
存储器,用于存放计算机程序;
处理器,用于执行存储器上所存放的程序时,实现权利要求1-5任一项所述的方法步骤。
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现权利要求1-5任一项所述的方法步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111403198.4A CN114281410A (zh) | 2021-11-24 | 2021-11-24 | 一种Redis集群代理模式的指令响应方法、装置及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111403198.4A CN114281410A (zh) | 2021-11-24 | 2021-11-24 | 一种Redis集群代理模式的指令响应方法、装置及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114281410A true CN114281410A (zh) | 2022-04-05 |
Family
ID=80869694
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111403198.4A Pending CN114281410A (zh) | 2021-11-24 | 2021-11-24 | 一种Redis集群代理模式的指令响应方法、装置及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114281410A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114817166A (zh) * | 2022-05-31 | 2022-07-29 | 苏州浪潮智能科技有限公司 | 一种取消文件操作的方法、装置及介质 |
-
2021
- 2021-11-24 CN CN202111403198.4A patent/CN114281410A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114817166A (zh) * | 2022-05-31 | 2022-07-29 | 苏州浪潮智能科技有限公司 | 一种取消文件操作的方法、装置及介质 |
CN114817166B (zh) * | 2022-05-31 | 2024-01-12 | 苏州浪潮智能科技有限公司 | 一种取消文件操作的方法、装置及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7467183B2 (en) | Method, apparatus, and user interface for managing electronic mail and alert messages | |
KR101153014B1 (ko) | 보다 효율적이고 신뢰성 있는 자원 액세스를 용이하게 하기 위한 자원의 컬렉션으로의 조직화 | |
US7702744B2 (en) | Semantic information network (SION) | |
US20070100960A1 (en) | Managing content for RSS alerts over a network | |
US8719338B2 (en) | Servicing database operations using a messaging server | |
US9940381B1 (en) | Managing information about entities using observations | |
US20070101341A1 (en) | Event locality using queue services | |
CN107534671B (zh) | 分布式服务实体和关联的聚合与联合 | |
CN110519240B (zh) | 一种单点登录方法、装置及系统 | |
US20150006555A1 (en) | Message Publishing and Subscribing Method and Apparatus | |
TW201317799A (zh) | 網路資源下載資訊的分享控制系統和方法 | |
US8214475B1 (en) | System and method for managing content interest data using peer-to-peer logical mesh networks | |
US20180314723A1 (en) | Managing multi-tenant keys in multi-tenant computing environments | |
US8914436B2 (en) | Data processing device and data retriever | |
US9742669B2 (en) | Aliasing of named data objects and named graphs for named data networks | |
CN114281410A (zh) | 一种Redis集群代理模式的指令响应方法、装置及电子设备 | |
US11728928B2 (en) | Securely sharing public and private blockchain data | |
WO2022057525A1 (zh) | 一种数据找回方法、装置、电子设备及存储介质 | |
US20150319204A1 (en) | Technique for communication in a communication network centered on information | |
US20170366447A1 (en) | Network Failover and Loop Detection in Hierarchical Networks | |
WO2014090058A1 (zh) | 二度好友查询系统、方法及存储介质 | |
JP6607044B2 (ja) | サーバー装置、分散ファイルシステム、分散ファイルシステム制御方法、および、プログラム | |
US20200195720A1 (en) | Communication device and communication method for processing meta data | |
CN111324674B (zh) | 业务处理方法、装置、服务器及存储介质 | |
US20240106670A1 (en) | Headers client for determining the best chain |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |