CN108737246B - 消息下发方法、装置、存储介质和服务器 - Google Patents
消息下发方法、装置、存储介质和服务器 Download PDFInfo
- Publication number
- CN108737246B CN108737246B CN201810426840.2A CN201810426840A CN108737246B CN 108737246 B CN108737246 B CN 108737246B CN 201810426840 A CN201810426840 A CN 201810426840A CN 108737246 B CN108737246 B CN 108737246B
- Authority
- CN
- China
- Prior art keywords
- message
- placeholder
- chain
- sequence number
- messages
- 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.)
- Active
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L51/00—User-to-user messaging in packet-switching networks, transmitted according to store-and-forward or real-time protocols, e.g. e-mail
- H04L51/04—Real-time or near real-time messaging, e.g. instant messaging [IM]
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L51/00—User-to-user messaging in packet-switching networks, transmitted according to store-and-forward or real-time protocols, e.g. e-mail
- H04L51/06—Message adaptation to terminal or network requirements
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L51/00—User-to-user messaging in packet-switching networks, transmitted according to store-and-forward or real-time protocols, e.g. e-mail
- H04L51/21—Monitoring or handling of messages
- H04L51/214—Monitoring or handling of messages using selective forwarding
Abstract
本发明提供一种即时通信的消息下发方法,包括如下步骤:获取即时通信的消息,基于Redis的zset数据结构把所述消息保存到内存,形成消息链条;接收删除消息的指令,获取所述删除消息在所述消息链条中对应的序列号;根据所述序列号把所述消息链条相应位置设置为占位符;根据所述消息链条下发消息。在本发明实施例中,所有的操作均在内存中完成,执行速度非常快;客户端在接收下发消息中发现占位符即可识别出存在补洞的数据,就相信下发消息真实性不会再次查漏补缺。本发明还提供了一种即时通信的消息下发装置、存储介质和服务器。
Description
技术领域
本发明涉及消息处理技术领域,具体而言,本发明涉及一种即时通信的消息下发方法、装置、存储介质和服务器。
背景技术
目前市面上几乎所有的社交软件在聊天功能中都会提供基于一对一的聊天功能,有的提供消息撤回功能,这样该消息就消失了不再会被看到。如何保证消息的顺序性以及撤销消息后如何保证新的消息链条可以正常的串起来一直是一个研究课题。同样,不同的产品的服务器的存储和算法的差异会导致效率和性能的迥异。
在现有的对消息合并方法中,在服务器将消息存在数据库表中,通过自增ID给每一个消息生成唯一的序列号,各个消息通过唯一序列号串联为一个会话,如果A删除了一条消息,则服务器会删除这个消息序列号对应的数据库记录;用户在客户端拉去消息时需要通过SQL进行范围查询。基于数据库的自增ID和范围查询属于磁盘IO操作,对消息的处理性能不好;删除消息造成消息的序列号不连续,给客户在客户端多设备拉取时,无法确认拉取消息数据有丢失还是服务器消息数据本身就时有缺损的,可能会进行二次拉取,造成不必要的开销给服务器造成压力。
发明内容
本发明针对现有方式的缺点,提出了一种即时通信的消息下发方法、装置和服务器,通过将删除消息设置为占位符后,客户端看到下发消息存在占位符即识别出存在补洞,而无需去验证遗漏消息,解决无需查漏的问题。
本发明提供一种即时通信的消息下发方法,包括如下步骤:
获取即时通信的消息,基于Redis的zset数据结构把所述消息保存到内存,形成消息链条;
接收删除消息的指令,获取所述删除消息在所述消息链条中对应的序列号;
根据所述序列号把所述消息链条相应位置设置为占位符;
根据所述消息链条下发消息。
优选地,所述消息的构成包括:消息发送方、消息接收方、消息内容类型和消息内容;所述占位符采用min和max两个节点进行标识范围。
优选地,所述基于Redis的zset数据结构把所述消息保存到内存,形成消息链条,包括:
将所述消息转换为二进制信息,并按照有序集合的存储结构在内存中存储,获取所述二进制信息对应的元素;
对每一个元素采用唯一分数进行对应绑定;
采用分数保存所述有序集合的序列号,实现将所述二进制信息转换为消息链条的形式。
优选地,对所述消息链条的查询命令为:zrangebyscoreabmsgs<minSeq><maxSeq>;
其中,zrangebyscore表示通过分数查询结果的命令,abmsgs表示保存ab之间的消息链条,minSeq表示最小的序列号,maxSeq表示最大的序列号。
优选地,所述根据所述序列号把所述消息链条相应位置设置为占位符,包括:
在所述消息链条中查找与所述序列号相对应的位置,在所述位置上重新添加同样分数的元素,形成占位符。
优选地,所述重新添加同样的分数的元素的添加命令为:zaddabmsgs seq1<place_holder_msg>;
其中,zadd表示添加同样分数的元素的命令,abmsgs表示保存ab之间的消息链条,seq1表示序列号,place_holder_msg表示占位符。
优选地,所述占位符的最小序列号和最大序列号均为所述占位符对应的序列号。
优选地,所述根据所述消息链条下发消息之前,还包括:
确认所述消息链条存在至少两个连续的占位符,把所述至少两个连续的占位符合并成一个占位符。
优选地,所述把所述至少两个连续的占位符合并成一个占位符,包括:
获取所述至少两个连续的占位符的最大序列号;
获取所述至少两个连续的占位符的最小序列号;
根据所述最大序列号和所述最小序列号组成一个占位符。
本发明还提供一种即时通信的消息下发装置,其包括:
消息保存模块:用于获取即时通信的消息,基于Redis的zset数据结构把所述消息保存到内存,形成消息链条;
序列号获取模块:用于接收删除消息的指令,获取所述删除消息在所述消息链条中对应的序列号;
占位符设置模块:用于根据所述序列号把所述消息链条相应位置设置为占位符;
消息下发模块:用于根据所述消息链条下发消息。
优选地,所述消息保存模块包括:
存储单元:用于将所述消息转换为二进制信息,并按照有序集合的存储结构在内存中存储,获取所述二进制信息对应的元素;
绑定单元:用于对每一个元素采用唯一分数进行对应绑定;
转化单元:用于采用分数保存所述有序集合的序列号,实现将所述二进制信息转换为消息链条的形式。
优选地,所述在消息下发模块之前还包括:
占位符合并模块:用于确认所述消息链条存在至少两个连续的占位符,把所述至少两个连续的占位符合并成一个占位符。
优选地,占位符合并模块包括:
第一获取单元:用于获取所述至少两个连续的占位符的最大序列号;
第二获取单元:用于获取所述至少两个连续的占位符的最小序列号;
重组单元:用于根据所述最大序列号和所述最小序列号组成一个占位符。
本发明还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如权利要求1至9中任意一项所述的消息下发方法。
本发明还提供一种服务器,其包括:
一个或多个处理器;
存储器;
一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序配置用于:执行根据权利要求1至9中任意一项所述的消息下发方法。
在本发明具体实施过程中,通过获取即时通信的消息,基于Redis的zset数据结构把所述消息保存到内存,形成消息链条;接收删除消息的指令,获取所述删除消息在所述消息链条中对应的序列号;根据所述序列号把所述消息链条相应位置设置为占位符;根据所述消息链条下发消息。所有的操作均在内存中完成,执行速度非常快;客户端在接收下发消息中发现占位符即可识别出存在补洞的数据,就相信下发消息真实性不会再次查漏补缺。
本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为本发明第一实施例中的即时通信的消息下发方法的流程示意图;
图2为本发明第二实施例中的即时通信的消息下发方法的流程示意图;
图3为本发明将消息保存在内存中并形成消息链条的流程示意图;
图4是本发明把至少两个连续的占位符合并成为一个占位符的流程示意图;
图5是本发明第三实施例中的即时通信的消息下发装置的结构组成示意图;
图6是本发明第四实施例中的即时通信的消息下发装置的结构组成示意图;
图7是本发明第五实施例中的执行即时通信的消息下发方法的服务器组成结构示意图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
实施例一:
请参阅图1,图1为本发明第一实施例中的即时通信的消息下发方法的流程示意图。
如图1所示,一种即时通信的消息下发方法,包括如下步骤:
S11:获取即时通信的消息,基于Redis的zset数据结构把所述消息保存到内存,形成消息链条;
即时通信是指能够即时发送和接收互联网消息等业务,即时通信的消息为一方向另一方发送的消息,在用户进行即时通信时,提供即时通信的服务器即可实时获取即时通信的消息,该消息包含了消息发送方、消息接收方以及消息内容类型和消息内容,并且对即时通信的消息所形成的占位符采用min和max两个节点来进行范围标识。
其中对即时通信消息的的定义和占位符采用min和max两个节点来进行范围标识是通过以下伪代码实现:
上述的伪代码描述描述了一个Message(消息)是构成,包括发送方、接收方以及content_type类型和content内容,正常的消息通过本身的type(类型)和content(内容)来表示;占位符有本身特殊的type(类型)区分消息,同时消息本身的数据结构PlaceHolderMessage通过min和max两个节点来表示范围,这个为后续步骤中,多个占位符的连续合并提供了保证。
基于Redis的zset数据结构把所述消息保存到内存,形成消息链条。
在本发明实施例中,存储是基于Redis(key-value存储系统(数据库))中的zeset(有序集合),zeset是一个可以排序的集合,在集合的内部,每一个元素member都有一个唯一的分数score与之对应绑定,即可通过元素member来保存具体的消息内容的二进制消息,用score来保存seq(序列号)进而实现消息链条形式的存储。
对链条存储形式消息的查询命令为:zrangebyscoreabmsgs<minSeq><maxSeq>;
其中,zrangebyscore表示通过分数查询结果的命令,abmsgs表示保存ab之间的消息链,minSeq表示最小的序列号,maxSeq表示最大的序列号,该命令会返回两个数值之间的所有score(分数)以及该score(分数)绑定的member(元素)。
其中,请参阅图3,图3为本发明将消息保存在内存中并形成消息链条的流程示意图。
如图3所示,详细步骤如下:
S111:将所述消息转换为二进制信息,并按照有序集合的存储结构在内存中存储,获取所述二进制信息对应的元素;
存储在内存中的消息需要首先转换为二进制信息才能存储,因此,将消息转换为二进制信息,将该二进制信息基于Redis的zset数据结构存储到内存中,Redis为key-value存储系统(数据库),zset为有序集合,该二进制信息按照有序集合的结构在内存中存储,该二进制信息在内存中会采用一个唯一的元素进行对应联系,通过该二进制信息即可获取到该消息对应的元素。
S112:对每一元素采用唯一分数进行对应绑定;
在内存存储中的有序集合内部,对每一个元素,都采用一个唯一的分数进行绑定,这样即可通过唯一的分数查询到对应的元素,即可通过对应的元素获取到对应的消息。
S113:采用分数保存所述有序集合的序列号,实现将所述二进制信息转换为消息链条的形式。
采用元素对应绑定的分数来保存有序集合中的序列号,因有序集合中的序列号是连续的,采用分数保存之后形成连续的链条即可将二进制信息转换为消息链条。
S12:接收删除消息的指令,获取所述删除消息在所述消息链条中对应的序列号;
当即时通信的双方中,一方向另一方发送消息之后,发现发送后的消息可能存在描述错误或者用词不当时,请求删除或撤回已发送消息,首先发出删除或撤回消息的指令,为用户双方提供即时通信的服务器接收到删除或撤回消息的指令之后,在消息链条中获取用户需要删除或撤回的消息在消息链条中对应的序列号。
S13:根据所述序列号把所述消息链条相应位置设置为占位符;
具体的,在所述消息链条中查找与所述序列号相对应的位置,在所述位置上重新添加同样分数的元素,形成占位符。
在具体实施过程中,当消息发送方删除或撤回消息指令后,数据库删除对应的消息,则获取删除消息对应的序列号,然后在数据库中的zset(有序集合)中查找对应的删除消息,然后从新添加与原来在zset(有序集合)同样的score的member;重新添加的通过命令实现,命令如下:zaddabmsgs seq1<place_holder_msg>;
其中,zadd表示添加同样分数的元素的命令,abmsgs表示保存ab之间的消息链,seq1表示序列号,place_holder_msg表示占位符。
形成占位符之后,该占位符的最小序列号和最大序列号均为所述占位符对应的序列号。
S14:根据所述消息链条下发消息。
在具体实施过程中,服务器将存在占位符的消息链条向请求下发消息的用户下发消息。
在此需要说明的是,即时通信中存在A、B用户双方或者更多用户方共同存在,在通过即时通信发送消息时,若一方发现已发送的消息可能存在表述不当或其他原因,请求撤回消息或删除消息,另一方在请求下发消息时,即通过上述的步骤对删除或者撤回的消息所在的位置设置占位符,使得消息链条保持连续,请求下发消息的另一方即可知道对方有撤回或删除消息,不会认为消息丢失。
在本发明具体实施过程中,所有的操作均在内存中完成,执行速度非常快;客户端在接收下发消息中发现占位符即可识别出存在补洞的数据,就相信下发消息真实性不会再次查漏补缺。
实施例二:
请参阅图2,图2为本发明第二实施例中的即时通信的消息下发方法的流程示意图。
如图2所示,一种即时通信的消息下发方法,包括如下步骤:
S21:获取即时通信的消息,基于Redis的zset数据结构把所述消息保存到内存,形成消息链条;
即时通信是指能够即时发送和接收互联网消息等业务,即时通信的消息为一方向另一方发送的消息,在用户进行即时通信时,提供即时通信的服务器即可实时获取即时通信的消息,该消息包含了消息发送方、消息接收方以及消息内容类型和消息内容,并且对即时通信的消息所形成的占位符采用min和max两个节点来进行范围标识。
其中对即时通信消息的的定义和占位符采用min和max两个节点来进行范围标识是通过以下伪代码实现:
上述的伪代码描述描述了一个Message(消息)是构成,包括发送方、接收方以及content_type类型和content内容,正常的消息通过本身的type(类型)和content(内容)来表示;占位符有本身特殊的type(类型)区分消息,同时消息本身的数据结构PlaceHolderMessage通过min和max两个节点来表示范围,这个为后续步骤中,多个占位符的连续合并提供了保证。
基于Redis的zset数据结构把所述消息保存到内存,形成消息链条。
在本发明实施例中,存储是基于Redis(key-value存储系统(数据库))中的zeset(有序集合),zeset是一个可以排序的集合,在集合的内部,每一个元素member都有一个唯一的分数score与之对应绑定,即可通过元素member来保存具体的消息内容的二进制消息,用score来保存seq(序列号)进而实现消息链条形式的存储。
对链条存储形式消息的查询命令为:zrangebyscoreabmsgs<minSeq><maxSeq>;
其中,zrangebyscore表示通过分数查询结果的命令,abmsgs表示保存ab之间的消息链,minSeq表示最小的序列号,maxSeq表示最大的序列号,该命令会返回两个数值之间的所有score(分数)以及该score(分数)绑定的member(元素)。
其中,请参阅图3,图3为本发明将消息保存在内存中并形成消息链条的流程示意图。
如图3所示,详细步骤如下:
S111:将所述消息转换为二进制信息,并按照有序集合的存储结构在内存中存储,获取所述二进制信息对应的元素;
存储在内存中的消息需要首先转换为二进制信息才能存储,因此,将消息转换为二进制信息,将该二进制信息基于Redis的zset数据结构存储到内存中,Redis为key-value存储系统(数据库),zset为有序集合,该二进制信息按照有序集合的结构在内存中存储,该二进制信息在内存中会采用一个唯一的元素进行对应联系,通过该二进制信息即可获取到该消息对应的元素。
S112:对每一元素采用唯一分数进行对应绑定;
在内存存储中的有序集合内部,对每一个元素,都采用一个唯一的分数进行绑定,这样即可通过唯一的分数查询到对应的元素,即可通过对应的元素获取到对应的消息。
S113:采用分数保存所述有序集合的序列号,实现将所述二进制信息转换为消息链条的形式。
采用元素对应绑定的分数来保存有序集合中的序列号,因有序集合中的序列号是连续的,采用分数保存之后形成连续的链条即可将二进制信息转换为消息链条。
S22:接收删除消息的指令,获取所述删除消息在所述消息链条中对应的序列号;
当即时通信的双方中,一方向另一方发送消息之后,发现发送后的消息可能存在描述错误或者用词不当时,请求删除或撤回已发送消息,首先发出删除或撤回消息的指令,为用户双方提供即时通信的服务器接收到删除或撤回消息的指令之后,在消息链条中获取用户需要删除或撤回的消息在消息链条中对应的序列号。
S23:根据所述序列号把所述消息链条相应位置设置为占位符;
具体的,在所述消息链条中查找与所述序列号相对应的位置,在所述位置上重新添加同样分数的元素,形成占位符。
在具体实施过程中,当消息发送方删除或撤回消息指令后,数据库删除对应的消息,则获取删除消息对应的序列号,然后在数据库中的zset(有序集合)中查找对应的删除消息,然后从新添加与原来在zset(有序集合)同样的score的member;重新添加的通过命令实现,命令如下:zaddabmsgs seq1<place_holder_msg>;
其中,zadd表示添加同样分数的元素的命令,abmsgs表示保存ab之间的消息链,seq1表示序列号,place_holder_msg表示占位符。
形成占位符之后,该占位符的最小序列号和最大序列号均为所述占位符对应的序列号。
S24:确认所述消息链条存在至少两个连续的占位符,把所述至少两个连续的占位符合并成一个占位符;
在具体实施过程中,通过遍历该消息链条的方式确认该消息链条中是否存在至少两个连续的占位符,若不存在,则直接进入S25,若存在,则对至少两个连续的占位符进行合并,合并成一个新的占位符。
对至少两个连续的占位符合并,为为采用该至少两个连续占位符消息中的最大序列号最为新的占位符消息的最大序列号,即取至少两个连续占位符消息中的max_seq为新的占位符消息的max_seq;在该至少两个连续占位符消息中的最小序列号为新的占位符消息的最小序列号,即取至少两个连续占位符消息中的min_seq为新的占位符消息的min_seq;从而实现对至少两个连续的占位符消息合并成为一个新的占位符消息,该新的占位符消息的表示范围为原来对于至少两个连续占位符消息的最大序列号和最小序列号。
具体如下:
表1是zset里存储的A和B的消息链条的情况,从左到右递增,即时间先后的消息,其中101、103、104和107的消息被删除(无论是A还是B删除的)
表1
对103和104号消息成为新的一个占位符消息,该新的占位符消息采用min_seq=103,max_seq=104序列号标识,这就叫做补洞,客户端拿到带有洞的数据就知道这个加载正常消息中间的seq范围确实是没有数据了,就不再去服务器请求验证是否有遗漏消息了。
又或者是,另一个例子:
如100是一个正常的消息,则100这个正常消息表示为member(100,100),若是97、98、99三个正常的消息都被删除了,则可以合并为member(97,99)。
其中,请参阅图4,图4是本发明把至少两个连续的占位符合并成为一个占位符的流程示意图。
如图4所示,详细步骤如下:
S241:获取所述至少两个连续的占位符的最大序列号;
对至少两个连续占位符消息采用该至少两个连续占位符消息中的最大序列号,即为获取至少两个连续占位符消息中的max_seq。
S242:获取所述至少两个连续的占位符的最小序列号;
在该至少两个连续占位符消息中的最小序列号,即为获取至少两个连续占位符消息中的min_seq。
S243:根据所述最大序列号和所述最小序列号组成一个占位符。
将至少两个连续的占位符合并成一个新的占位符,则需要有这个新的占位符的最小和最大的序列号,在S241和S242中以获取到新的占位符的最小和最大的序列号,则采用该最小和最大序列号组成一个新的占位符。如将103和104合并成一个新的占位符消息,则该新的占位符消息采用min_seq=103,max_seq=104序列号标识,为member(103,104)。
S25:根据所述消息链条下发消息。
在具体实施过程中,服务器将存在占位符的消息链条向请求下发消息的用户下发消息。
在本发明具体实施过程中,所有的操作均在内存中完成,执行速度非常快;客户端在接收下发消息中发现占位符即可识别出存在补洞的数据,就相信下发消息真实性不会再次查漏补缺;基于合并连续漏洞的方案可以大大减少下发洞的个数,减少带宽占用。
实施例三:
请参阅图5,图5是本发明第三实施例中的即时通信的消息下发装置的结构组成示意图。
如图5所示,一种即时通信的消息下发装置,其包括:
消息保存模块11:用于获取即时通信的消息,基于Redis的zset数据结构把所述消息保存到内存,形成消息链条;
即时通信是指能够即时发送和接收互联网消息等业务,即时通信的消息为一方向另一方发送的消息,在用户进行即时通信时,提供即时通信的服务器即可实时获取即时通信的消息,该消息包含了消息发送方、消息接收方以及消息内容类型和消息内容,并且对即时通信的消息所形成的占位符采用min和max两个节点来进行范围标识。
其中对即时通信消息的的定义和占位符采用min和max两个节点来进行范围标识是通过以下伪代码实现:
上述的伪代码描述描述了一个Message(消息)是构成,包括发送方、接收方以及content_type类型和content内容,正常的消息通过本身的type(类型)和content(内容)来表示;占位符有本身特殊的type(类型)区分消息,同时消息本身的数据结构PlaceHolderMessage通过min和max两个节点来表示范围,这个为后续步骤中,多个占位符的连续合并提供了保证。
基于Redis的zset数据结构把所述消息保存到内存,形成消息链条。
在本发明实施例中,存储是基于Redis(key-value存储系统(数据库))中的zeset(有序集合),zeset是一个可以排序的集合,在集合的内部,每一个元素member都有一个唯一的分数score与之对应绑定,即可通过元素member来保存具体的消息内容的二进制消息,用score来保存seq(序列号)进而实现消息链条形式的存储。
对链条存储形式消息的查询命令为:zrangebyscoreabmsgs<minSeq><maxSeq>;
其中,zrangebyscore表示通过分数查询结果的命令,abmsgs表示保存ab之间的消息链,minSeq表示最小的序列号,maxSeq表示最大的序列号,该命令会返回两个数值之间的所有score(分数)以及该score(分数)绑定的member(元素)。
其中,该消息保存模块11还包括:
存储单元:用于将所述消息转换为二进制信息,并按照有序集合的存储结构在内存中存储,获取所述二进制信息对应的元素;
存储在内存中的消息需要首先转换为二进制信息才能存储,因此,将消息转换为二进制信息,将该二进制信息基于Redis的zset数据结构存储到内存中,Redis为key-value存储系统(数据库),zset为有序集合,该二进制信息按照有序集合的结构在内存中存储,该二进制信息在内存中会采用一个唯一的元素进行对应联系,通过该二进制信息即可获取到该消息对应的元素。
绑定单元:用于对每一元素采用唯一分数进行对应绑定;
在内存存储中的有序集合内部,对每一个元素,都采用一个唯一的分数进行绑定,这样即可通过唯一的分数查询到对应的元素,即可通过对应的元素获取到对应的消息。
转化单元:用于采用分数保存所述有序集合的序列号,实现将所述二进制信息转换为消息链条的形式。
采用元素对应绑定的分数来保存有序集合中的序列号,因有序集合中的序列号是连续的,采用分数保存之后形成连续的链条即可将二进制信息转换为消息链条。
序列号获取模块12:用于接收删除消息的指令,获取所述删除消息在所述消息链条中对应的序列号;
当即时通信的双方中,一方向另一方发送消息之后,发现发送后的消息可能存在描述错误或者用词不当时,请求删除或撤回已发送消息,首先发出删除或撤回消息的指令,为用户双方提供即时通信的服务器接收到删除或撤回消息的指令之后,在消息链条中获取用户需要删除或撤回的消息在消息链条中对应的序列号。
占位符设置模块13:用于根据所述序列号把所述消息链条相应位置设置为占位符;
具体的,在所述消息链条中查找与所述序列号相对应的位置,在所述位置上重新添加同样分数的元素,形成占位符。
在具体实施过程中,当消息发送方删除或撤回消息指令后,数据库删除对应的消息,则获取删除消息对应的序列号,然后在数据库中的zset(有序集合)中查找对应的删除消息,然后从新添加与原来在zset(有序集合)同样的score的member;重新添加的通过命令实现,命令如下:zaddabmsgs seq1<place_holder_msg>;
其中,zadd表示添加同样分数的元素的命令,abmsgs表示保存ab之间的消息链,seq1表示序列号,place_holder_msg表示占位符。
形成占位符之后,该占位符的最小序列号和最大序列号均为所述占位符对应的序列号。
消息下发模块14:用于根据所述消息链条下发消息。
在具体实施过程中,服务器将存在占位符的消息链条向请求下发消息的用户下发消息。
在本发明具体实施过程中,所有的操作均在内存中完成,执行速度非常快;客户端在接收下发消息中发现占位符即可识别出存在补洞的数据,就相信下发消息真实性不会再次查漏补缺。
实施例四:
请参阅图6,图6是本发明第四实施例中的即时通信的消息下发装置的结构组成示意图。
如图6所示,一种即时通信的消息下发装置,包括:
消息保存模块21:用于获取即时通信的消息,基于Redis的zset数据结构把所述消息保存到内存,形成消息链条;
序列号获取模块22:用于接收删除消息的指令,获取所述删除消息在所述消息链条中对应的序列号;
占位符设置模块23:用于根据所述序列号把所述消息链条相应位置设置为占位符;
上述的消息保存模块21、序列号获取模块22、占位符设置模块23的具体实施方式可以参考实施例一至实施例三,在此不再赘述。
占位符合并模块24:用于确认所述消息链条存在至少两个连续的占位符,把所述至少两个连续的占位符合并成一个占位符。
在具体实施过程中,通过遍历该消息链条的方式确认该消息链条中是否存在至少两个连续的占位符,若不存在,则直接进入消息下发模块25直接下发消息,若存在,则对至少两个连续的占位符进行合并,合并成一个新的占位符。
对至少两个连续的占位符合并,为为采用该至少两个连续占位符消息中的最大序列号最为新的占位符消息的最大序列号,即取至少两个连续占位符消息中的max_seq为新的占位符消息的max_seq;在该至少两个连续占位符消息中的最小序列号为新的占位符消息的最小序列号,即取至少两个连续占位符消息中的min_seq为新的占位符消息的min_seq;从而实现对至少两个连续的占位符消息合并成为一个新的占位符消息,该新的占位符消息的表示范围为原来对于至少两个连续占位符消息的最大序列号和最小序列号。
具体如下:
表1是zset里存储的A和B的消息链条的情况,从左到右递增,即时间先后的消息,其中101、103、104和107的消息被删除(无论是A还是B删除的)
表1
对103和104号消息成为新的一个占位符消息,该新的占位符消息采用min_seq=103,max_seq=104序列号标识,这就叫做补洞,客户端拿到带有洞的数据就知道这个加载正常消息中间的seq范围确实是没有数据了,就不再去服务器请求验证是否有遗漏消息了。
又或者是,另一个例子:
如100是一个正常的消息,则100这个正常消息表示为member(100,100),若是97、98、99三个正常的消息都被删除了,则可以合并为member(97,99)。
占位符合并模块14还包括:
第一获取单元:用于获取所述至少两个连续的占位符的最大序列号;
对至少两个连续占位符消息采用该至少两个连续占位符消息中的最大序列号,即为获取至少两个连续占位符消息中的max_seq。
第二获取单元:用于获取所述至少两个连续的占位符的最小序列号;
在该至少两个连续占位符消息中的最小序列号,即为获取至少两个连续占位符消息中的min_seq。
重组单元:用于根据所述最大序列号和所述最小序列号组成一个占位符。
将至少两个连续的占位符合并成一个新的占位符,则需要有这个新的占位符的最小和最大的序列号,在S241和S242中以获取到新的占位符的最小和最大的序列号,则采用该最小和最大序列号组成一个新的占位符。如将103和104合并成一个新的占位符消息,则该新的占位符消息采用min_seq=103,max_seq=104序列号标识,为member(103,104)。
消息下发模块15:用于根据所述消息链条下发消息。
在具体实施过程中,服务器将存在占位符的消息链条向请求下发消息的用户下发消息。
在本发明具体实施过程中,所有的操作均在内存中完成,执行速度非常快;客户端在接收下发消息中发现占位符即可识别出存在补洞的数据,就相信下发消息真实性不会再次查漏补缺;基于合并连续漏洞的方案可以大大减少下发洞的个数,减少带宽占用。
实施例五:
本发明实施例提供的一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现任一项技术方案所述的消息下发方法。其中,所述计算机可读存储介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、CD-ROM、和磁光盘)、ROM(Read-Only Memory,只读存储器)、RAM(Random AcceSS Memory,随即存储器)、EPROM(EraSable Programmable Read-Only Memory,可擦写可编程只读存储器)、EEPROM(Electrically EraSableProgrammableRead-Only Memory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,存储设备包括由设备(例如,计算机、手机)以能够读的形式存储或传输消息的任何介质,可以是只读存储器,磁盘或光盘等。
请参阅图7,图7是本发明第五实施例中的执行即时通信的消息下发方法的服务器组成结构示意图。
如图7所示,一种服务器,处理器702、存储器703、输入单元704以及显示单元705等器件。图7所示的结构器件并不构成对所有服务器的限定,可以比图7更多或更少部件,或组合某些部件。
存储器703可用于存储应用程序701以及各功能模块,处理器702运行存储在存储器703的应用程序701,从而执行设备的各种功能应用以及数据处理。存储器可以是内存储器或外存储器,或者包括内存储器和外存储器两者。内存储器可以包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦写可编程ROM(EEPROM)、快闪存储器、或者随机存储器。外存储器可以包括硬盘、软盘、ZIP盘、U盘、磁带等。本发明所公开的存储器包括但不限于这些类型的存储器。本发明所公开的存储器只作为例子而非作为限定。
输入单元704用于接收信号的输入,以及接收用户输入的关键字。输入单元704可包括触控面板以及其它输入设备。触控面板可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触控面板上或在触控面板附近的操作),并根据预先设定的程序驱动相应的连接装置;其它输入设备可以包括但不限于物理键盘、功能键(比如播放控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。显示单元705可用于显示用户输入的信息或提供给用户的信息以及终端设备的各种菜单。显示单元705可采用液晶显示器、有机发光二极管等形式。处理器702是终端设备的控制中心,利用各种接口和线路连接整个设备的各个部分,通过运行或执行存储在存储器702内的软件程序和/或模块,以及调用存储在存储器内的数据,执行各种功能和处理数据。
作为一个实施例,所述计算机设备包括:一个或多个处理器702,存储器703,一个或多个应用程序701,其中所述一个或多个应用程序701被存储在存储器703中并被配置为由所述一个或多个处理器702执行,所述一个或多个程序701配置用于执行上述实施例中的消息下发方法。
本发明实施例提供的服务器可实现上述提供的消息链条下发方法的实施例,具体功能实现请参详方法实施例中的说明,在此不再赘述。
在本发明具体实施过程中,所有的操作均在内存中完成,执行速度非常快;客户端在接收下发消息中发现占位符即可识别出存在补洞的数据,就相信下发消息真实性不会再次查漏补缺;基于合并连续漏洞的方案可以大大减少下发洞的个数,减少带宽占用。
应该理解的是,虽然附图的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,其可以以其他的顺序执行。而且,附图的流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,其执行顺序也不必然是依次进行,而是可以与其他步骤或者其他步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (12)
1.一种即时通信的消息下发方法,其特征在于,包括如下步骤:
获取即时通信的消息,基于Redis的zset数据结构把所述消息保存到内存,形成消息链条;
接收删除消息的指令,获取所述删除消息在所述消息链条中对应的序列号;
根据所述序列号把所述消息链条相应位置设置为占位符;
根据所述消息链条下发消息;
其中,所述基于Redis的zset数据结构把所述消息保存到内存,形成消息链条,包括:
将所述消息转换为二进制信息,并按照有序集合的存储结构在内存中存储,获取所述二进制信息对应的元素;
对每一个元素采用唯一分数进行对应绑定;
采用分数保存所述有序集合的序列号,实现将所述二进制信息转换为消息链条的形式;
所述根据所述序列号把所述消息链条相应位置设置为占位符,包括:
在所述消息链条中查找与所述删除消息在所述消息链条中对应的序列号相对应的位置,在该位置上重新添加在原来有序集合的同样分数的元素,形成占位符。
2.根据权利要求1所述的消息下发方法,其特征在于,所述消息的构成包括:消息发送方、消息接收方、消息内容类型和消息内容;所述占位符采用min和max两个节点进行标识范围。
3.根据权利要求1所述的消息下发方法,其特征在于,对所述消息链条的查询命令为:zrangebyscore abmsgs<minSeq><maxSeq>;
其中,zrangebyscore表示通过分数查询结果的命令,abmsgs表示保存ab之间的消息链条,minSeq表示最小的序列号,maxSeq表示最大的序列号。
4.根据权利要求1所述的消息下发方法,其特征在于,所述重新添加同样分数的元素的添加命令为:zadd abmsgs seq1<place_holder_msg>;
其中,zadd表示添加同样分数的元素的命令,abmsgs表示保存ab之间的消息链条,seq1表示序列号,place_holder_msg表示占位符。
5.根据权利要求1所述的消息下发方法,其特征在于,所述占位符的最小序列号和最大序列号均为所述占位符对应的序列号。
6.根据权利要求1所述的消息下发方法,其特征在于,所述根据所述消息链条下发消息之前,还包括:
确认所述消息链条存在至少两个连续的占位符,把所述至少两个连续的占位符合并成一个占位符。
7.根据权利要求6所述的消息下发方法,其特征在于,所述把所述至少两个连续的占位符合并成一个占位符,包括:
获取所述至少两个连续的占位符的最大序列号;
获取所述至少两个连续的占位符的最小序列号;
根据所述最大序列号和所述最小序列号组成一个占位符。
8.一种即时通信的消息下发装置,其特征在于,包括:
消息保存模块:用于获取即时通信的消息,基于Redis的zset数据结构把所述消息保存到内存,形成消息链条;
序列号获取模块:用于接收删除消息的指令,获取所述删除消息在所述消息链条中对应的序列号;
占位符设置模块:用于根据所述序列号把所述消息链条相应位置设置为占位符;
消息下发模块:用于根据所述消息链条下发消息;
其中,所述消息保存模块包括:
存储单元:用于将所述消息转换为二进制信息,并按照有序集合的存储结构在内存中存储,获取所述二进制信息对应的元素;
绑定单元:用于对每一个元素采用唯一分数进行对应绑定;
转化单元:用于采用分数保存所述有序集合的序列号,实现将所述二进制信息转换为消息链条的形式;
所述占位符设置模块,具体用于在所述消息链条中查找与所述删除消息在所述消息链条中对应的序列号相对应的位置,在该位置上重新添加在原来有序集合的同样分数的元素,形成占位符。
9.根据权利要求8所述的消息下发装置,其特征在于,在所述消息下发模块之前还包括:
占位符合并模块:用于确认所述消息链条存在至少两个连续的占位符,把所述至少两个连续的占位符合并成一个占位符。
10.根据权利要求9所述的消息下发装置,其特征在于,占位符合并模块包括:
第一获取单元:用于获取所述至少两个连续的占位符的最大序列号;
第二获取单元:用于获取所述至少两个连续的占位符的最小序列号;
重组单元:用于根据所述最大序列号和所述最小序列号组成一个占位符。
11.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1至7中任意一项所述的消息下发方法。
12.一种服务器,其特征在于,其包括:
一个或多个处理器;
存储器;
一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序配置用于:执行根据权利要求1至7中任意一项所述的消息下发方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810426840.2A CN108737246B (zh) | 2018-05-07 | 2018-05-07 | 消息下发方法、装置、存储介质和服务器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810426840.2A CN108737246B (zh) | 2018-05-07 | 2018-05-07 | 消息下发方法、装置、存储介质和服务器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108737246A CN108737246A (zh) | 2018-11-02 |
CN108737246B true CN108737246B (zh) | 2021-02-02 |
Family
ID=63937008
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810426840.2A Active CN108737246B (zh) | 2018-05-07 | 2018-05-07 | 消息下发方法、装置、存储介质和服务器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108737246B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111327915A (zh) * | 2020-02-21 | 2020-06-23 | 北京字节跳动网络技术有限公司 | 确定消息到达率的方法及装置 |
CN111669313B (zh) * | 2020-05-29 | 2022-05-03 | 广西东信互联科技有限公司 | 一种即时通讯系统消息的储存及同步方法 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10346542B2 (en) * | 2012-08-31 | 2019-07-09 | Verint Americas Inc. | Human-to-human conversation analysis |
CN102984676B (zh) * | 2012-11-29 | 2015-07-08 | 华为终端有限公司 | 处理消息会话的方法和终端 |
US20160057093A1 (en) * | 2014-08-19 | 2016-02-25 | Samsung Electronics Co., Ltd. | Method and apparatus for displaying content |
CN105608103A (zh) * | 2015-10-16 | 2016-05-25 | 北京奇虎科技有限公司 | 数据存储结构的转换方法及装置 |
CN105490919B (zh) * | 2015-11-24 | 2019-11-08 | 小米科技有限责任公司 | 消息撤回方法和装置 |
-
2018
- 2018-05-07 CN CN201810426840.2A patent/CN108737246B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN108737246A (zh) | 2018-11-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103190123B (zh) | 用于分发发布的消息的方法和装置 | |
US8296372B2 (en) | Method and system for merging electronic messages | |
CN102710763B (zh) | 一种分布式缓存池化、分片及故障转移的方法及系统 | |
US20220035786A1 (en) | Distributed database management system with dynamically split b-tree indexes | |
CN112866111A (zh) | 流表管理的方法和装置 | |
CN108737246B (zh) | 消息下发方法、装置、存储介质和服务器 | |
CN110399348A (zh) | 文件重删方法、装置、系统及计算机可读存储介质 | |
US8352442B2 (en) | Determination of an updated data source from disparate data sources | |
CN109976924A (zh) | 接口调用方法及装置 | |
CN111752960B (zh) | 数据处理方法和装置 | |
CN113886494A (zh) | 即时通讯的消息存储方法、装置、设备及计算机可读介质 | |
CN111552934A (zh) | 数据库访问方法以及装置 | |
CN110519212B (zh) | 一种基于匿名推断的通信转发系统 | |
CN104424224A (zh) | 一种文件索引存储方法及装置 | |
US10025859B2 (en) | Method and system for second-degree friend query | |
US11755555B2 (en) | Storing an ordered associative array of pairs using an append-only storage medium | |
US10855563B2 (en) | Supplementing log messages with metadata | |
US20170286440A1 (en) | Method, business processing server and data processing server for storing and searching transaction history data | |
CN111046106A (zh) | 缓存数据同步方法、装置、设备及介质 | |
CN104125254A (zh) | 获取平台用户资料的方法和系统 | |
CN112260935B (zh) | 消息处理方法、装置、电子设备及可读存储介质 | |
EP2751720B1 (en) | Processing communications data | |
CN111259031A (zh) | 数据更新方法、装置、设备和存储介质 | |
CN101872356B (zh) | 一种内存数据库处理性能的方法与系统 | |
WO2013053254A1 (en) | Index creation method and system |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |