CN113239307A - 用于存储消息主题的方法及装置 - Google Patents
用于存储消息主题的方法及装置 Download PDFInfo
- Publication number
- CN113239307A CN113239307A CN202110537088.0A CN202110537088A CN113239307A CN 113239307 A CN113239307 A CN 113239307A CN 202110537088 A CN202110537088 A CN 202110537088A CN 113239307 A CN113239307 A CN 113239307A
- Authority
- CN
- China
- Prior art keywords
- node
- message
- nodes
- determining
- identifier
- 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
- 238000000034 method Methods 0.000 title claims abstract description 78
- 230000008569 process Effects 0.000 claims description 26
- 238000004590 computer program Methods 0.000 claims description 11
- 238000006243 chemical reaction Methods 0.000 claims description 7
- 230000004044 response Effects 0.000 claims description 2
- 239000000126 substance Substances 0.000 claims 1
- 238000010586 diagram Methods 0.000 description 21
- 238000004891 communication Methods 0.000 description 9
- 239000003795 chemical substances by application Substances 0.000 description 7
- 238000012545 processing Methods 0.000 description 6
- 238000013507 mapping Methods 0.000 description 4
- 230000006870 function Effects 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 230000033228 biological regulation Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000007667 floating Methods 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 238000003491 array Methods 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 230000007423 decrease Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000010801 machine learning Methods 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 239000002245 particle Substances 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000001953 sensory effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/95—Retrieval from the web
- G06F16/958—Organisation or management of web site content, e.g. publishing, maintaining pages or automatic linking
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本公开提供了一种用于存储消息主题的方法及装置,涉及计算机技术领域,尤其涉及物联网技术领域。具体实现方案为:获取待存储的消息主题,其中,消息主题包括具有层级关系的多个字符串;根据层级关系,将消息主题中的字符串转换为字典树中的节点,得到目标字典树;以及存储目标字典树。
Description
技术领域
本公开涉及计算机技术领域,尤其涉及物联网技术领域。
背景技术
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上。MQTT具有轻量、简单、开放和易于实现的特点。MQTT在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT传输的消息包括消息主题(Topic)和负载(payload)。其中,Topic可以用于表示消息的类型,payload可以用于表示消息的内容,订阅者订阅Topic后,就会收到与该Topic对应的消息内容(即payload);
发明内容
本公开提供了一种用于存储消息主题的方法、装置、设备以及存储介质。
根据本公开的一方面,提供了一种用于存储消息主题的方法,包括:获取待存储的消息主题,其中,所述消息主题包括具有层级关系的多个字符串;根据所述层级关系,将所述消息主题中的字符串转换为字典树中的节点,得到目标字典树;以及存储所述目标字典树。
根据本公开的另一方面,提供了一种用于存储消息主题的装置,包括:获取模块,用于获取待存储的消息主题,其中,所述消息主题包括具有层级关系的多个字符串;转换模块,用于根据所述层级关系,将所述消息主题中的字符串转换为字典树中的节点,得到目标字典树;以及存储模块,用于存储所述目标字典树。
本公开的另一个方面提供了一种计算设备,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行本公开实施例所示的方法。
根据本公开实施例的另一方面,提供了一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行本公开实施例所示的方法。
根据本公开实施例的另一方面,提供了一种计算机程序产品,计算机程序,所述计算机程序在被处理器执行时实现本公开实施例所示的方法。
应当理解,本部分所描述的内容并非旨在标识本公开的实施例的关键或重要特征,也不用于限制本公开的范围。本公开的其它特征将通过以下的说明书而变得容易理解。
附图说明
附图用于更好地理解本方案,不构成对本公开的限定。其中:
图1示意性示出了根据本公开的实施例的用于存储消息主题的方法的应用场景的流示意图;
图2示意性示出了根据本公开实施例的用于存储消息主题的方法的流程图;
图3示意性示出了根据本公开实施例的将消息主题中的字符串转换为字典树的节点的方法的流程图;
图4示意性示出了根据本公开的实施例的确定节点标识的方法的流程图;
图5示意性示出了根据本公开另一实施例的用于存储消息主题的方法的流程图;
图6示意性示出了根据本公开的实施例的字典树的示意图;
图7示意性示出了根据本公开实施例的key/value结构的节点的示意图;
图8示意性示出了根据本公开另一实施例的key/value结构的节点的示意图;
图9示意性示出了根据本公开实施例的信息主题到订阅者的路由关系的示意图;
图10示意性示出了根据本公开实施例的订阅者到信息主题的映射关系的示意图;
图11示意性示出了根据本公开实施例的用于存储消息主题的装置的框图;以及
图12示意性示出了根据本公开实施例的示例电子设备的示意性框图。
具体实施方式
以下结合附图对本公开的示范性实施例做出说明,其中包括本公开实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本公开的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
以下将结合图1,对用于存储消息主题的方法的应用场景进行详细描述。
图1示意性示出了根据本公开实施例的用于存储消息主题的方法的应用场景的流示意图。
如图1所示,该应用场景100可以包括消息的发布者(Publisher)11、消息的代理(Broker)12和消息的订阅者(Subscriber)13、14、15。
其中,发布者11和订阅者13、14、15可以是客户端。该客户端可以是使用MQTT协议的应用程序或者设备。需要说明的是,发布者11也可以同时是订阅者,订阅者13、14、15也可以同时是发布者。
代理12可以是服务器。该服务器可以是云服务器,又称为云计算服务器或云主机,是云计算服务体系中的一项主机产品,以解决了传统物理主机与VPS服务(″VirtualPrivate Server″,或简称″VPS″)中,存在的管理难度大,业务扩展性弱的缺陷。该服务器也可以为分布式系统的服务器,或者是结合了区块链的服务器。
根据本公开的实施例,发布者11可以建立与代理12之间的网络连接,然后向代理12发布其他客户端可能会订阅的消息。订阅者13、14、15也可以建立与代理12之间的网络连接,并通过代理12获取订阅发布者11发布的消息。代理12可以用于记录消息的消息主题(Topic)21,以及每个消息主题21所对应的订阅者信息22。当发布者11发布新的消息时,代理12可以根据与该消息的消息主题21对应的订阅者信息22,确定订阅了该消息的订阅者13、14、15。然后将该消息发送至订阅者13、14、15。
需要说明的是,本公开所提供的用于存储消息主题的方法可以由代理12执行。相应地,本公开所提供的用于存储消息主题的装置可以设置于代理12中。本公开所提供的用于存储消息主题的方法也可以由不同于代理12且能够与代理12通信的服务器或服务器集群执行。相应地,本公开所提供的用于存储消息主题的装置也可以设置于不同于代理12且能够与代理12通信的服务器或服务器集群中。
应该理解,图1中的发布者、代理和订阅者的数目仅仅是示意性的。根据实现需要,可以具有任意数目的发布者、代理和订阅者。
以下将结合图2,对用于存储消息主题的方法进行详细描述。
图2示意性示出了根据本公开实施例的用于存储消息主题的方法的流程图。
如图2所示,该用于存储消息主题的方法200可以包括操作S210~S230。
在操作S210,获取待存储的消息主题。
根据本公开的实施例,消息主题可以用于表示多个设备之间传输的消息的类型,消息主题可以包括具有层级关系的多个字符串。示例性地,本实施例中,字符串例如可以包括产品标识符、设备名称等。
然后,在操作S220,根据层级关系,将消息主题中的字符串转换为字典树中的节点,得到目标字典树。
根据本公开的实施例,字典树(Trie)是一种树形数据结构,可以将消息主题转换为字典树来进行存储。在转换时,可以根据消息主题中每个字符串配置字典树中对应的节点,可以根据字符串之间的层级关系配置节点之间的父子关系。
在操作S230,存储目标字典树。
根据本公开的实施例,通过将消息主题按照层级转换为字典树,利用字典树来保存消息主题,可以节省存储空间。
以下将结合图3,对根据层级关系,将消息主题中的字符串转换为字典树的节点的方法进行详细描述。
图3示意性示出了根据本公开实施例的将消息主题中的字符串转换为字典树的节点的方法的流程图。
如图3所示,该将消息主题中的字符串转换为字典树的节点的方法330例如可以包括操作S331~S334。
在操作S331,确定与每个字符串对应的节点,得到多个节点。
根据本公开的实施例,每个字符串对应于字典树中的一个节点。本实施例中,若不同消息主题的最高层级的字符串相同,则可以将这些最高层级的字符串转换为同一个字典树中的根节点。另外,若对于不同消息主题,从最高层级开始连续多个层级中的字符串均相同,则可以将这些相同的字符串转换为同一个字典树中的同一个节点。
例如,对于两个消息主题:forex/stock/nyse和forex/stock/#,其最高层级均为forex,且次高层级均为stock,因此可以将两个消息主题中的forex转换为同一个字典树中的同一个根节点,将两个消息主题中的stock转换为该根节点的同一个子节点。
在操作S332,根据多个字符串之间的层级关系,确定多个节点之间的父子关系。
根据本公开的实施例,可以以层级从高至低的顺序,依次生成节点。例如,可以将第一层级的字符串转换为根节点,第二层级的字符串转换为根节点的子节点,然后第三层级的字符串转换为该子节点的子节点,依次类推,直到将最后一个层级(即,最低层级)的字符串转换为对应的节点(即,叶子节点)。
在操作S333,确定多个节点中每个节点的节点标识,并根据节点标识确定节点的键值。
根据本公开的实施例,节点标识可以用于标识每个节点,不同节点的节点标识不同。可以根据节点的节点标识和节点的子节点个数,确定节点的键值。示例性地,本实施例中,可以将节点标识和用于表示子节点个数的子节点个数标识进行拼接,得到节点的键值。其中,节点标识和子节点个数标识可以采用任意拼接方式。示例性地,本实施例中,可以将节点标识作为头部,将子节点个数标识作为尾部拼接在一起,从而得到节点的键值。
例如,节点的节点标识为0x0001,节点的子节点个数为2,则可以确定子节点标识为02,然后将节点标识0x0001作为头部,将子节点个数标识02作为尾部拼接在一起,得到该节点的键值为<0x0001>02,其中,“<”和“>”为分隔符。
根据本公开的实施例,节点标识可以配置为固定长度的字符串,由此可以减少空间复杂度。
在操作S334,根据与每个节点对应的字符串,确定节点的键名。
根据本公开的实施例,对于作为根节点的节点,可以根据固定标识和与节点对应的字符串,确定节点的键名。其中,固定标识在确保不与其他节点的节点标识重复的情况下可以任意设置。根据本公开的实施例,对于不是根节点的节点,可以根据节点的父节点的节点标识和与节点对应的字符串,确定节点的键名。通过上述键名设置方法,使得节点的键名包含了该节点的父节点的信息,从而根据节点的键名即可确定节点之间的层级关系。
示例性地,本实施例中,对于根节点,可以将固定标识和根节点所对应的字符串进行拼接,得到该根节点的键名。对于不是根节点的节点,可以将节点的父节点的节点标识和与节点对应的字符串进行拼接,得到该节点的键名。其中,可以采用任意方式进行拼接。
示例性地,本实施例中,对于根节点,可以将固定标识作为头部,将根节点所对应的字符串作为尾部拼接在一起,从而得到根节点的键名。对于不是根节点的节点,可以将节点的父节点的节点标识作为头部,以与节点对应的字符串作为尾部拼接在一起,得到该节点的键名。
例如,根节点的固定标识为0x0000,根节点所对应的字符串为forex,则可以将固定标识0x0000作为头部,将根节点所对应的字符串forex作为尾部拼接在一起,得到根节点的键名为<0x0000>forex,其中,“<”和“>”为分隔符。
又例如,父节点的节点标识为0x000A,对于该父节点的一个子节点的所对应的字符串为stock,则可以将节点标识0x000A作为头部,将子节点所对应的字符串stock作为尾部拼接在一起,得到子节点的键名为<0x000A>stock。
以下将结合图4,对确定节点标识进行详细描述。
图4示意性示出了根据本公开的实施例的确定节点标识的方法的流程图。
如图4所示,该确定节点标识的方法例如可以包括操作S410~S420。
在操作S410,针对每个节点,确定与节点对应的进程标识、叶子节点标识、时间标识和序列值。
根据本公开的实施例,可以根据节点是否为叶子节点来确定叶子节点标识。示例性地,本实施例中,可以配置叶子节点所对应的叶子节点标识为1,可以配置非叶子节点所对应的叶子节点标识为0。
根据本公开的实施例,可以根据基准时刻和系统计时器值,确定时间标识,其中,基准时刻可以为获取待存储的消息主题的时刻。
示例性地,本实施例中,可以在用于操作字典树的进程启动时记录当前的挂钟时间(WallClock)Tw作为基准时刻,以系统的纳秒值时间(nanoSecond)Tns作为系统计时器值,其中,挂钟时间以毫秒为单位,纳秒值时间以纳秒为单位。然后每次触发生成时间标识的操作时获取当前的纳秒值时间Tns′,最终的时间标识timestamp=Tw+Floor((Tns′-Tns)/1000000),其中,Floor表示浮点类型转换操作。
根据本公开的实施例,进程标识例如可以是每个用于操作字典树的进程的全局标识。可以获取用于操作字典树的进程启动时系统的时间戳,根据时间戳,确定进程标识。示例性地,本实施例中,可以通过系统的UnixTimeStamp参数来获取启动时的时间戳,该时间戳精确到秒。然后以时间戳的低15位作为进程标识。通过该方式生成的进程标识以秒为精度,可以在约9小时内不发生重复。
根据本公开的实施例,可以根据多个节点中生成节点的次序,得到与节点对应的序列值。示例性地,本实施例中,序列值是0到1023之间的值,序列值的初始值为0,每次生成新的序列值时将上一次得到序列值加一并对1024取模,得到新的序列值。
在操作S420,根据进程标识、叶子节点标识、时间标识和序列值,确定节点的节点标识。
根据本公开的实施例,可以将进程标识、叶子节点标识、时间标识和序列值进行拼接,从而得到节点标识。其中,进程标识、叶子节点标识、时间标识和序列值可以采用任意拼接方式。示例性地,本实施例以叶子节点标识作为头部,以时间标识、进程标识和序列值的顺序,依次将时间标识、进程标识和序列值拼接在叶子标识的后面,从而得到节点标识。例如,节点的叶子节点标识为0,时间标识为10,进程标识为20,序列值为30,则可以依次将时间标识10、进程标识20和序列值30拼接在叶子标识0的后面,得到节点标识为0102030。
图5示意性示出了根据本公开另一实施例的用于存储消息主题的方法的流程图。
如图5所示,该用于存储消息主题的方法500例如可以包括操作S510~S560。
在操作S510,获取待存储的消息主题。
根据本公开的实施例,操作S510可以参考上文所示的获取待存储的消息主题的操作,在此不再赘述。
在操作S520,根据层级关系,将消息主题中的字符串转换为字典树中的节点,得到目标字典树。
根据本公开的实施例,操作S520可以参考上文所示的得到目标字典树的操作,在此不再赘述。
在操作S530,存储目标字典树。
根据本公开的实施例,操作S530可以参考上文所示的存储目标字典树的操作,在此不再赘述。
在操作S540,响应于接收到针对消息主题的订阅者信息,获取消息主题和订阅者信息之间的路由关系。
根据本公开的实施例,订阅者信息例如可以包括订阅该消息主题的订阅者的标识信息。消息主题和订阅者信息之间的路由关系可以用于表示有哪些订阅者订阅了该消息主题。
在操作S550,根据消息主题和订阅者信息之间的路由关系,生成目标键值对。
根据本公开的实施例,目标键值对包括目标键名和目标键值,目标键名可以包括与消息主题中层级最低的字符串对应的节点的节点标识,目标键值可以包括订阅者信息。
在操作S560,存储目标键值对。
根据本公开的实施例,在存储消息主题和订阅者信息之间的路由关系时,通过以与消息主题中最低层级对应的节点的节点标识作为键名,相比于以消息主题本身作为键名,可以减少键名的长度,从而节省存储空间。
下面参考图6~图10,结合具体实施例对用于存储消息主题的方法做进一步说明。本领域技术人员可以理解,以下示例实施例仅用于理解本公开,本公开并不局限于此。
示例性地,本实施例中,待存储的消息主题(以下称为Topic)包括以下多个:
forex/stock/nyse
forex/stock/#
forex/index
forex/+/nyse
forex/+
其中,每一个Topic包括多个字符串,各个字符串之间使用分隔符“/”进行分隔,用于表示字符串之间的层级关系。例如,forex/stock/nyse包括forex、stock和nyse三个字符串,其中,forex对应于第一层级(最高层级),stock对应于第二层级(次低层级),nyse对应于第三层级(最低层级)。
图6示意性示出了根据本公开的实施例的字典树的示意图。
如图6所示,对于每一个Topic,根据层级进行拆分,将拆分后的字符串转换为字典树的节点,其中,第一层转换为根节点,最后一层转换为叶节点,其他层根据层级关系分别转换为根节点与叶节点之间的节点。在转换后,从根节点到每个叶节点之间的路径即表示一个完整的Topic。在图6的示例中,将以上示例的Topic转换为字典树,第一层级的forex转换为根节点611,第二层级的stock、index和“+”分别转换为根节点与叶节点之间的节点621、622和623,最低层级的nyse、“#”和nyse分别转换为叶节点631、632和633。
根据本公开的实施例,在使用Trie保存Topic的情况下,若不同Topic的最高层级的字符串相同,则可以将这些最高层级的字符串转换为同一个Trie中的根节点。另外,若对于不同Topic,从最高层级开始连续多个层级中的字符串均相同,则可以将这些相同的字符串转换为同一个Trie中的同一个节点点,从而可以节省空间。
根据本公开的实施例,将Topic保存为Trie后,该Trie暂存与内存中,从而可以在内存中对Trie进行构建并进行各种增删改查的操作。然而,单台机器的内存总是有上限的,为了能够保存更多的Topic信息,也可以将此Trie保存到数据库中。
根据本公开的实施例,在Trie中的每个节点都有value,value的值为Topic对应层级的字符串。此外除了根节点以外,每个节点都有父节点。因此可以将Trie中的节点转换为key/value(键名/键值)结构,key为父节点到此节点的路径,根节点的key可以为其对应的字符串。value则为此节点的子节点列表。基于此,图7示意性示出了根据本公开实施例的key/value结构的节点的示意图。在图7的示例中,根节点611的key 711A为forex,根节点611的value 711B为节点611的子节点621、622和623的列表<stock,index,+>。此外,节点621的key 721A为根节点611到节点621的路径forex/stock,节点621的value 721B为节点621的子节点631、632的列表<nyse,#>。叶节点631的key 731A为根节点611到叶节点631的路径forex/stock/nyse,叶节点631的value 731B为空列表<>。同理,还可以得到节点632的key 732A为列表forex/stock/#,节点632的value732B为空列表<>。节点622的key 722A为列表forex/index,节点622的value 722B为空列表<>。节点623的key 723A为列表forex/+,节点623的value 723B为列表<nyse>。节点633的key 733A为列表forex/+/nyse,节点633的value 733B为空列表<>。
如图7所示,每个节点的key占用的空间大小跟Topic中每个层级的字符串长度有关。当Topic为“/a…a/…/aaa/aa/a”这种形式,即每个层级的字符串长度从左到右依次递减的时候,占用的空间复杂度为O(M*N2),其中,M为最大子串长度,N为颗粒时间,可见空间开销较大。
根据本公开的另一实施例,为了减少空间复杂度,可以为每个节点生成唯一的固定长度的节点标识作为节点key的前缀。假设节点标识的长度为64个bit,那么整体的空间开销为16*(N-1)bytes,空间复杂度为O(N),即降低了空间开销和空间复杂度。
基于此,图8示意性示出了根据本公开另一实施例的key/value结构的节点的示意图。
如图8所示,每个层级所对应的key由固定长度的前缀拼接此层级的字符串而得到,对应的value为此层级的固定长度的节点标识。示例性地,本实施例中,节点标识总共64个bit,从高位到低位的构成依次是:1 bit的叶子节点标识,38bit的时间标识timestamp、15bit的全局进程标识globalprocess id和10bit的序列值sequence。其中,最高位的叶子节点标识用于标识叶子节点,此位为1则表示节点是叶子节点,此位为0则表示节点不是叶子节点。
timestamp是本地生成的单调递增的精确到毫秒的时间标识,能够使用8.7年不重复。为了保证timestamp部分的单调递增性,可以用于操作字典树的进程启动时记录当前的WallClock参数Tw作为基准时刻,以系统的nanoSecond参数Tns作为系统计时器值,其中,WallClock参数以毫秒为单位,nanoSecond参数以纳秒为单位。然后每次触发生成时间标识的操作时获取当前的纳秒值时间Tns′,最终得到时间标识timestamp=Tw+Floor((Tns′-Tns)/1000000),其中,Floor表示浮点类型转换操作。global process id是每个要操作Trie的进程的全局标识,可以获取Unix TimeStamp参数的低15位作为global process id,通过该方式能在约9小时内产生以秒为精度的唯一id。示例性地,本实施例中,在同一秒内只启动一个进程,从而保证进程的全局标识唯一。sequence是0到1023之间的值,sequence的初始值为0,每次生成新的sequence时将上一次得到序列值加一并对1024取模,得到新的序列值。
利用上面的算法为每个节点都生成固定长度的节点标识后,可以将节点标识作为节点的node pointer(节点指针)。基于此,对于每个节点,可以用父节点的node pointer作为前缀,后面拼接上此节点的字符串得到该节点的key,其中,由于根节点没有父节点,根节点可以使用固定值,如0x0000作为前缀。节点的value则是一个12字节的数据,前8个字节为此节点的node pointer,后面四个字节为该节点的子节点的数量。通过上述方法将一个Trie的节点转换为key/value结构,可以使用任意的KV(key/value)数据库进行存储。
例如,在图8的示例中,字符串forex对应于根节点811,示例性地,本实施例中,根节点811的固定前缀为0x0000,其中,0x表示16进制。因此可以确定根节点811的key 811A为<0x0000>forex,其中,“<”和“>”为分隔符。另外,根节点811的节点标识为0x000A,根节点811具有3个子节点,因此根节点811的value 811B为<0x000A>03。
字符串“+”对应于节点823,该节点823的父节点是根节点811。因此,可以将根节点811的节点标识0x000A与该节点823的字符串“+”拼接,得到该节点823的key 823A为<0x000A>+。然后该节点823的节点标识为0x0003,该节点823具有一个子节点,因此,该节点823的value 823B为<0x0003>01。
字符串nyse对应于叶子节点833,该叶子节点833的父节点是字符串“+”所对应的节点823。因此,可以将节点823的节点标识0x0003与该叶子节点833的字符串nyse拼接,得到该叶子节点833的key 833A为<0x0003>nyse。然后该叶子节点833的节点标识为0x0006,该叶子节点833没有子节点,因此,该叶子节点833的value 833B为<0x0006>00。
示例性地,表1示意性示出了根据本实施例的消息主题与订阅者之间的路由关系示意图。其中,inbox1(0)、inbox2(0)、inbox2(1)、inbox3(0),inbox4(0)和inbox5(0)表示不同的订阅者信息。
消息主题 | 订阅者 |
forex/stock/nyse | inbox1(0),inbox2(1) |
forex/stock/# | inbox2(0) |
forex/index | inbox3(0),inbox4(0) |
forex/+/nyse | inbox4(0) |
forex/+ | inbox5(0) |
表1
基于此,图9示意性示出了根据本公开实施例的信息主题到订阅者的路由关系的示意图。如图9所示,在保存消息主题到订阅者信息的路由关系时,可以针对每个消息主题,以消息主题最低层级在Trie中的节点指针(即TriNodePointer)作为key,以该消息主题所对应的所有订阅者(即Subinfo)作为value,生成键值对,存储在Map中。从而,在需要匹配某个消息主题时,可以先根据Trie结构找到该消息主题的节点指针,然后根据节点指针可以查找到对应的订阅者。
例如,在图9的示例中,forex/stock/nyse的最低层级为在Trie中的节点指针为字符串nyse所对应的节点标识0x0004,forex/stock/nyse的订阅者包括inbox1(0)和inbox2(1),因此,可以以<0x0004>作为key,以<inbox1(0),inbox2(1)>作为value,生成键值对,用于记录forex/stock/nyse到订阅者信息的路由关系。与之类似地,可以分别生成用于记录表1中其他路由关系的键值对。
此外,图10示意性示出了根据本公开另一实施例的订阅者到信息主题的映射关系的示意图。如图10所示,还可以再使用另外一个Map保存订阅者到信息主题的映射,从而方便寻找订阅者订阅的所有信息主题。
在图10的示例中,订阅者包括inbox1、inbox2、inbox3、inbox4和inbox5。针对每个订阅者,可以以该订阅者作为key,以该订阅者所订阅的消息主题(TopicFilterinfo)为value,生成多个键值对,用于记录订阅者到信息主题的映射关系。例如,订阅者inbox1订阅的主题包括forex/stock/nyse,因此,该订阅者所对应的key为inbox1,对应的value为<″forex/stock/nyse″>。
图11示意性示出了根据本公开实施例的用于存储消息主题的装置的框图。
如图11所示,用于存储消息主题的装置1100包括获取模块1110、转换模块1120和存储模块1130。
获取模块1110,可以用于获取待存储的消息主题,其中,消息主题包括具有层级关系的多个字符串。
转换模块1120,可以用于根据层级关系,将消息主题中的字符串转换为字典树中的节点,得到目标字典树。
存储模块1130,可以用于存储目标字典树。
需要说明的是,本公开的技术方案中,所涉及的信息的获取、存储和应用等,均符合相关法律法规的规定,且不违背公序良俗。
根据本公开的实施例,本公开还提供了一种电子设备、一种可读存储介质和一种计算机程序产品。
图12示出了可以用来实施本公开的实施例的示例电子设备1200的示意性框图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。
如图12所示,设备1200包括计算单元1201,其可以根据存储在只读存储器(ROM)1202中的计算机程序或者从存储单元1208加载到随机访问存储器(RAM)1203中的计算机程序,来执行各种适当的动作和处理。在RAM 1203中,还可存储设备1200操作所需的各种程序和数据。计算单元1201、ROM 1202以及RAM 1203通过总线1204彼此相连。输入/输出(I/O)接口1205也连接至总线1204。
设备1200中的多个部件连接至I/O接口1205,包括:输入单元1206,例如键盘、鼠标等;输出单元1207,例如各种类型的显示器、扬声器等;存储单元1208,例如磁盘、光盘等;以及通信单元1209,例如网卡、调制解调器、无线通信收发机等。通信单元1209允许设备1200通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
计算单元1201可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元1201的一些示例包括但不限于中央处理单元(CPU)、图形处理单元(GPU)、各种专用的人工智能(AI)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(DSP)、以及任何适当的处理器、控制器、微控制器等。计算单元1201执行上文所描述的各个方法和处理,例如用于存储消息主题的方法。例如,在一些实施例中,用于存储消息主题的方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元1208。在一些实施例中,计算机程序的部分或者全部可以经由ROM 1202和/或通信单元1209而被载入和/或安装到设备1200上。当计算机程序加载到RAM 1203并由计算单元1201执行时,可以执行上文描述的用于存储消息主题的方法的一个或多个步骤。备选地,在其他实施例中,计算单元1201可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行用于存储消息主题的方法。
本文中以上描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、芯片上系统的系统(SOC)、负载可编程逻辑设备(CPLD)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置、和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置、和该至少一个输出装置。
用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)和互联网。
计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本发公开中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本公开公开的技术方案所期望的结果,本文在此不进行限制。
上述具体实施方式,并不构成对本公开保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本公开的精神和原则之内所作的修改、等同替换和改进等,均应包含在本公开保护范围之内。
Claims (13)
1.一种用于存储消息主题的方法,包括:
获取待存储的消息主题,其中,所述消息主题包括具有层级关系的多个字符串;
根据所述层级关系,将所述消息主题中的字符串转换为字典树中的节点,得到目标字典树;以及
存储所述目标字典树。
2.根据权利要求1所述的方法,其中,所述节点包括相互对应的键名和键值;所述根据所述层级关系,将所述消息主题中的字符串转换为字典树的节点,包括:
确定与所述每个字符串对应的节点,得到多个节点;
根据所述多个字符串之间的层级关系,确定所述多个节点之间的父子关系;
确定所述多个节点中每个节点的节点标识,并根据节点标识确定所述节点的键值;以及
根据与所述每个节点对应的字符串,确定所述节点的键名。
3.根据权利要求2所述的方法,还包括:
响应于接收到针对所述消息主题的订阅者信息,获取所述消息主题和所述订阅者信息之间的路由关系;
根据所述消息主题和订阅者信息之间的路由关系,生成目标键值对,其中,所述目标键值对包括目标键名和目标键值,所述目标键名包括与所述消息主题中层级最低的字符串对应的节点的节点标识,所述目标键值包括所述订阅者信息;以及
存储所述目标键值对。
4.根据权利要求2所述的方法,其中,所述根据节点标识确定所述节点的键值,包括:
根据所述节点的节点标识和所述节点的子节点个数,确定所述节点的键值。
5.根据权利要求4所述的方法,其中,所述根据与每个节点对应的字符串,确定所述节点的键名,包括:
对于作为根节点的节点,根据固定标识和与所述节点对应的字符串,确定所述节点的键名;以及
对于不是根节点的节点,根据所述节点的父节点的节点标识和与所述节点对应的字符串,确定所述节点的键名。
6.根据权利要求2-5中任一项所述的方法,其中,所述确定所述每个节点的节点标识,包括:
针对所述每个节点,确定与所述节点对应的进程标识、叶子节点标识、时间标识和序列值;以及
根据所述进程标识、叶子节点标识、时间标识和序列值,确定所述节点的节点标识。
7.根据权利要求6所述的方法,其中,所述确定与所述节点对应的叶子节点标识,包括:
根据所述节点是否为叶子节点来确定所述叶子节点标识。
8.根据权利要求6所述的方法,其中,所述确定与所述节点对应的时间标识,包括:
根据基准时刻和系统计时器值,确定所述时间标识,其中,所述基准时刻为所述获取待存储的消息主题的时刻。
9.根据权利要求6所述的方法,其中,所述确定与所述节点对应的序列值,包括:
根据多个节点中生成所述节点的次序,得到与所述节点对应的序列值。
10.一种用于存储消息主题的装置,包括:
获取模块,用于获取待存储的消息主题,其中,所述消息主题包括具有层级关系的多个字符串;
转换模块,用于根据所述层级关系,将所述消息主题中的字符串转换为字典树中的节点,得到目标字典树;以及
存储模块,用于存储所述目标字典树。
11.一种电子设备,包括:
至少一个处理器;以及
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行权利要求1-9中任一项所述的方法。
12.一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行根据权利要求1-9中任一项所述的方法。
13.一种计算机程序产品,包括计算机程序,所述计算机程序在被处理器执行时实现根据权利要求1-9中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110537088.0A CN113239307A (zh) | 2021-05-17 | 2021-05-17 | 用于存储消息主题的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110537088.0A CN113239307A (zh) | 2021-05-17 | 2021-05-17 | 用于存储消息主题的方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113239307A true CN113239307A (zh) | 2021-08-10 |
Family
ID=77134864
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110537088.0A Pending CN113239307A (zh) | 2021-05-17 | 2021-05-17 | 用于存储消息主题的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113239307A (zh) |
Citations (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060047666A1 (en) * | 2004-08-28 | 2006-03-02 | Bedi Bharat V | Control of publish/subscribe messaging |
US20110258268A1 (en) * | 2010-04-19 | 2011-10-20 | International Business Machines Corporation | Controlling message delivery in publish/subscribe messaging |
US20120233268A1 (en) * | 2011-03-11 | 2012-09-13 | International Business Machines Corporation | Publish/subscribe message routing |
CN103299297A (zh) * | 2011-12-28 | 2013-09-11 | 华为技术有限公司 | 文件目录存储方法、检索方法和设备 |
US20150254328A1 (en) * | 2013-12-26 | 2015-09-10 | Webtrends Inc. | Methods and systems that categorize and summarize instrumentation-generated events |
CN107862026A (zh) * | 2017-10-31 | 2018-03-30 | 北京小度信息科技有限公司 | 数据存储方法及装置、数据查询方法及装置、电子设备 |
CN107872473A (zh) * | 2016-09-23 | 2018-04-03 | 阿里巴巴集团控股有限公司 | 消息处理方法、装置以及系统 |
CN108965447A (zh) * | 2018-07-27 | 2018-12-07 | 四川爱创科技有限公司 | 数据采集和远程控制的方法及系统 |
CN109032821A (zh) * | 2018-08-27 | 2018-12-18 | 百度在线网络技术(北京)有限公司 | 主题消息处理方法、装置、设备及存储介质 |
CN109428922A (zh) * | 2017-08-29 | 2019-03-05 | 华为技术有限公司 | 一种订阅发布方法及服务器 |
CN109862063A (zh) * | 2018-11-12 | 2019-06-07 | 平安科技(深圳)有限公司 | 基于mqtt的发布订阅匹配方法、装置及存储介质 |
CN110086636A (zh) * | 2019-04-17 | 2019-08-02 | 平安科技(深圳)有限公司 | 一种基于mqtt的消息分发方法、服务器及存储介质 |
CN110109873A (zh) * | 2019-05-08 | 2019-08-09 | 重庆大学 | 一种用于消息队列的文件管理方法 |
CN110276609A (zh) * | 2018-03-14 | 2019-09-24 | 北京三快在线科技有限公司 | 业务数据处理方法及装置、电子设备、计算机可读介质 |
CN111651476A (zh) * | 2020-05-18 | 2020-09-11 | 青岛海洋科学与技术国家实验室发展中心 | 一种物联网关中mqtt主题的快速匹配方法及系统 |
CN111814091A (zh) * | 2020-07-17 | 2020-10-23 | 北京达佳互联信息技术有限公司 | 消息分发方法及相关装置 |
CN111966633A (zh) * | 2020-08-14 | 2020-11-20 | 北京百度网讯科技有限公司 | 用于查询目录下子节点的方法、装置、电子设备及介质 |
-
2021
- 2021-05-17 CN CN202110537088.0A patent/CN113239307A/zh active Pending
Patent Citations (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060047666A1 (en) * | 2004-08-28 | 2006-03-02 | Bedi Bharat V | Control of publish/subscribe messaging |
US20110258268A1 (en) * | 2010-04-19 | 2011-10-20 | International Business Machines Corporation | Controlling message delivery in publish/subscribe messaging |
US20120233268A1 (en) * | 2011-03-11 | 2012-09-13 | International Business Machines Corporation | Publish/subscribe message routing |
CN103299297A (zh) * | 2011-12-28 | 2013-09-11 | 华为技术有限公司 | 文件目录存储方法、检索方法和设备 |
US20150254328A1 (en) * | 2013-12-26 | 2015-09-10 | Webtrends Inc. | Methods and systems that categorize and summarize instrumentation-generated events |
CN107872473A (zh) * | 2016-09-23 | 2018-04-03 | 阿里巴巴集团控股有限公司 | 消息处理方法、装置以及系统 |
CN109428922A (zh) * | 2017-08-29 | 2019-03-05 | 华为技术有限公司 | 一种订阅发布方法及服务器 |
CN107862026A (zh) * | 2017-10-31 | 2018-03-30 | 北京小度信息科技有限公司 | 数据存储方法及装置、数据查询方法及装置、电子设备 |
CN110276609A (zh) * | 2018-03-14 | 2019-09-24 | 北京三快在线科技有限公司 | 业务数据处理方法及装置、电子设备、计算机可读介质 |
CN108965447A (zh) * | 2018-07-27 | 2018-12-07 | 四川爱创科技有限公司 | 数据采集和远程控制的方法及系统 |
CN109032821A (zh) * | 2018-08-27 | 2018-12-18 | 百度在线网络技术(北京)有限公司 | 主题消息处理方法、装置、设备及存储介质 |
CN109862063A (zh) * | 2018-11-12 | 2019-06-07 | 平安科技(深圳)有限公司 | 基于mqtt的发布订阅匹配方法、装置及存储介质 |
CN110086636A (zh) * | 2019-04-17 | 2019-08-02 | 平安科技(深圳)有限公司 | 一种基于mqtt的消息分发方法、服务器及存储介质 |
CN110109873A (zh) * | 2019-05-08 | 2019-08-09 | 重庆大学 | 一种用于消息队列的文件管理方法 |
CN111651476A (zh) * | 2020-05-18 | 2020-09-11 | 青岛海洋科学与技术国家实验室发展中心 | 一种物联网关中mqtt主题的快速匹配方法及系统 |
CN111814091A (zh) * | 2020-07-17 | 2020-10-23 | 北京达佳互联信息技术有限公司 | 消息分发方法及相关装置 |
CN111966633A (zh) * | 2020-08-14 | 2020-11-20 | 北京百度网讯科技有限公司 | 用于查询目录下子节点的方法、装置、电子设备及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
WO2014131299A1 (en) | Method, system, server and client device for message synchronizing | |
CN112769897A (zh) | 边缘计算消息的同步方法、装置、电子设备及存储介质 | |
CN108874946B (zh) | 一种id管理方法及装置 | |
CN111523001A (zh) | 用于存储数据的方法、装置、设备以及存储介质 | |
CN114253979A (zh) | 一种报文处理方法、装置及电子设备 | |
CN114500633B (zh) | 数据转发方法、相关装置、程序产品及数据传输系统 | |
CN114428907B (zh) | 信息搜索方法、装置、电子设备及存储介质 | |
CN115145938A (zh) | 企业用户身份标识体系构建方法、装置、设备、介质 | |
CN113312539B (zh) | 一种检索服务的提供方法、装置、设备和介质 | |
CN114866617A (zh) | 一种微服务请求处理方法、装置、设备及介质 | |
CN114153986A (zh) | 一种知识图谱构建方法、装置、电子设备及存储介质 | |
CN113239307A (zh) | 用于存储消息主题的方法及装置 | |
CN116932147A (zh) | 流式作业处理方法、装置、电子设备及介质 | |
CN109617960B (zh) | 一种基于属性化分离的web AR数据呈现方法 | |
CN114579311B (zh) | 执行分布式计算任务的方法、装置、设备以及存储介质 | |
CN113344074B (zh) | 模型训练方法、装置、设备及存储介质 | |
CN114969444A (zh) | 数据的处理方法、装置、电子设备和存储介质 | |
CN114546343A (zh) | 活动页面的生成方法和装置 | |
CN113691403A (zh) | 拓扑节点配置方法、相关装置及计算机程序产品 | |
CN113676521A (zh) | 业务请求的响应方法、装置及电子设备 | |
CN112926822A (zh) | 一种资源分配方法和装置 | |
CN109284332A (zh) | 数据处理方法、客户端、服务器及计算机可读存储介质 | |
CN114449031B (zh) | 信息获取方法、装置、设备和存储介质 | |
CN115242733B (zh) | 报文组播方法、组播网关、电子设备及存储介质 | |
CN108337151A (zh) | 实现即时通讯中用户消息多设备同步漫游的方法及系统 |
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 |