本发明属于通信技术领域,尤其涉及一种消息的处理方法、装置、计算机设备及存储介质。
背景技术:
现有技术中,聊天消息的记录方式采用基于客户端的存储方式。若用户更换设备,则无法查看以往的聊天对象及聊天内容。进一步地,若一个聊天群中有100个成员,如果用户张三对其他99个成员发送:大家好。那么“大家好”这条消息将存储100份到每个成员的客户端下,这样就重复存储了99份。随着用户量的增加和消息量的增大,这种重复存储会消耗很大的存储资源;并且在对消息是否已读取、是否已删除进行处理时,逻辑会更加复杂。若应用程序的用户达到上千万,每个用户的消息数量也有数百上千条时,要针对每条数据操作的话,会大大降低消息发送、拉取及删除的性能。
技术实现要素:
本发明实施例提供了一种消息的处理方法、装置、计算机设备及存储介质,以解决现有技术中基于客户端的存储方式导致的存储资源消耗大、消息发送、读取及删除的处理逻辑复杂的问题。
第一方面,本发明实施例提供了一种消息的处理方法,所述处理方法包括:
获取消息发送请求,所述消息发送请求中包括发送方的对象标识、接收方的对象标识以及消息体;
根据所述发送方的对象标识和接收方的对象标识,从聊天关系库中查询对应的聊天关系标识及聊天关系;
若所述聊天关系库中存在对应的聊天关系标识及聊天关系,则根据所述聊天关系标识,将所述消息体保存至消息详情库中,并在所述消息详情库中记录所述消息体的消息标识、发送方的对象标识以及发送时间;
根据所述消息标识更新所述聊天关系中发送方的对象标识对应的删除游标取值和已读游标取值。
进一步地,所述处理方法还包括:
若所述聊天关系库中不存在对应的聊天关系标识及聊天关系,则在所述聊天关系库中创建所述发送方和接收方的对象标识对应的聊天关系,并生成所述聊天关系对应的聊天关系标识;
关联所述聊天关系标识、发送方的对象标识和接收方的对象标识,并保存至所述聊天关系中;
初始化所述聊天关系中每一对象标识对应的删除游标取值和已读游标取值。
进一步地,所述处理方法还包括:
获取消息列表拉取请求,所述消息列表拉取请求中包括请求方的对象标识;
从所述聊天关系库中查询包括所述请求方的对象标识的聊天关系及其对应的聊天关系标识;
针对每一聊天关系标识,从对应的聊天关系中获取所述请求方的对象标识对应的删除游标取值和已读游标取值,根据所述删除游标取值从所述消息详情库中筛选出所述请求方的未删除消息,以及根据所述已读游标取值从所述消息详情库中筛选出所述请求方的未读消息;
将所有聊天关系标识及请求方对应的未删除消息、未读消息封装为第一对外消息,将所述第一对外消息发送至所述请求方。
进一步地,所述处理方法还包括:
获取消息删除请求,所述消息删除请求中包括请求方的对象标识、待处理的聊天关系标识以及已删除消息;
从所述聊天关系库中查询所述待处理的聊天关系标识对应的聊天关系,作为待处理的聊天关系;
将所述待处理的聊天关系中的所述请求方的对象标识对应的删除游标取值更新为所述已删除消息的消息标识的最大值。
进一步地,所述处理方法还包括:
获取消息拉取请求,所述消息拉取请求中包括请求方的对象标识、待处理的聊天关系标识;
从所述聊天关系库中查询所述待处理的聊天关系标识对应的聊天关系,从所查询到的聊天关系中读取所述请求方的对象标识对应的已读游标取值;
根据所述待处理的聊天关系标识、已读游标取值从所述消息详情库中筛选出所述请求方的未读消息;
将所述聊天关系标识、请求方的对象标识及未读消息封装为第二对外消息,将所述第二对外消息发送至所述请求方。
进一步地,在根据所述待处理的聊天关系标识、已读游标取值从所述消息详情库中筛选出所述请求方的未读消息之后,所述处理方法还包括:
将所查询到的聊天关系中的所述请求方的对象标识对应的已读游标取值更新为所筛选出的未读消息的消息标识的最大值。
第二方面,本发明实施例提供了一种消息的处理装置,所述处理装置包括:
消息获取模块,用于获取消息发送请求,所述消息发送请求中包括发送方的对象标识、接收方的对象标识以及消息体;
关系查询模块,用于根据所述发送方的对象标识和接收方的对象标识,从聊天关系库中查询对应的聊天关系标识及聊天关系;
消息保存模块,用于若所述聊天关系库中存在对应的聊天关系标识及聊天关系,则根据所述聊天关系标识,将所述消息体保存至消息详情库中,并在所述消息详情库中记录所述消息体的消息标识、发送方的对象标识以及发送时间;
游标更新模块,用于根据所述消息标识更新所述聊天关系中发送方的对象标识对应的删除游标取值和已读游标取值。
进一步地,所述处理装置还包括:
关系创建模块,用于若所述聊天关系库中不存在对应的聊天关系标识及聊天关系,则在所述聊天关系库中创建所述发送方和接收方的对象标识对应的聊天关系,并生成所述聊天关系对应的聊天关系标识;
关联存储模块,用于关联所述聊天关系标识、发送方的对象标识和接收方的对象标识,并保存至所述聊天关系中;
初始化模块,用于初始化所述聊天关系中每一对象标识对应的删除游标取值和已读游标取值。
第三方面,本发明实施例提供了一种计算机设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上所述的消息的处理方法的步骤。
第四方面,本发明实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的消息的处理方法的步骤。
与现有技术相比,本发明实施例将聊天对象的关系和消息内容分开独立存储;当获取到消息发送请求,首先根据消息发送请求中发送方的对象标识和接收方的对象标识,从聊天关系库中查询对应的聊天关系标识及聊天关系;若所述聊天关系库中存在对应的聊天关系标识及聊天关系,则根据所述聊天关系标识,将所述消息体保存至消息详情库中,并在所述消息详情库中记录所述消息体的消息标识、发送方的对象标识以及发送时间;最后根据所述消息标识更新所述聊天关系中发送方的对象标识对应的删除游标取值和已读游标取值;从而实现了在服务端存储聊天记录,且聊天关系和消息详情分开存储,并通过游标方式来关联聊天关系和消息详情,既保证了聊天消息的一致性,也节省了数据存储空间,提高了消息发送、拉取及删除操作的性能,解决了现有技术中基于客户端的存储方式导致的存储资源消耗大、消息发送、读取及删除的处理逻辑复杂的问题。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的消息的处理方法的第一实现流程图;
图2是本发明实施例提供的消息的处理方法的第二实现流程图;
图3是本发明实施例提供的消息的处理方法的第三实现流程图;
图4是本发明实施例提供的消息的处理方法的第四实现流程图;
图5是本发明实施例提供的消息的处理方法的第五实现流程图;
图6是本发明实施例提供的消息的处理装置的组成结构图;
图7是本发明实施例提供的计算机设备的示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供的消息的处理方法应用于服务端,以实现在服务端存储聊天记录。客户端上的应用程序通过调用服务端提供的接口,发出处理请求,服务端则根据所述处理请求执行对应的处理方法。用户可在客户端上查看处理结果。可选地,所述消息包括但不限于短信、社交类应用程序中的聊天消息、站内信。
图1示出了本发明实施例提供的消息的处理方法的第一实现流程。本发明实施例提供的所述消息的处理方法应用于服务端。参阅图1,所述消息的处理方法包括:
在步骤s101中,获取消息发送请求,所述消息发送请求中包括发送方的对象标识、接收方的对象标识以及消息体。
在本发明实施例中,当用户使用客户端在应用程序上发送消息时,客户端根据用户输入的消息内容生成消息发送请求。服务端从客户端获取并解析所述消息发送请求。
在所述消息发送请求中,至少包括消息体、发送方的对象标识和接收方的对象标识。其中,所述消息体即用户输入的消息内容。所述发送方的对象标识和接收方的对象标识为均为用户对象在应用程序上的身份标识号码,每一个用户对象对应一个对象标识,用于区分不同的用户对象。在这里,发送方和接收方是相对的,每一个用户对象既可以作为发送方发送消息,也可以作为接收方接收消息。每一个消息发送请求中包括发送本次消息内容的发送方的对象标识、接收本次消息内容的接收方的对象标识。所述接收方的对象标识可以是一个,也可以是多个。
在步骤s102中,根据所述发送方的对象标识和接收方的对象标识,从聊天关系库中查询对应的聊天关系标识及聊天关系。
与现有技术不相同,本发明实施例采用聊天对象的关系和消息内容分开存储的方式,并通过创建聊天关系库来保存聊天对象的关系,消息详情库来保存消息内容。
所述聊天关系库存储了至少一个聊天关系im_relation。所述聊天关系是指由应用程序上的用户对象组成的聊天组,包括但不限于仅包括两个用户对象的单聊组、三个及以上个用户对象的群聊组。每一个单聊组或群聊组产生时,同步地在聊天关系库中创建对应的聊天关系,用于存储聊天组中的各用户对象的对象标识及其对应的状态信息;并生成所述聊天关系对应的关系标识号码,得到聊天关系标识。
所述消息详情库中存储了至少一个消息详情表im_info。每一个聊天关系对应一个消息详情表,即每一个聊天组对应一个消息详情表。每一个单聊组或群聊组产生聊天消息时,同步地将消息内容保存至消息详情库中的消息详情表。所述消息详情表存储了聊天组中每条消息的消息体及其消息标识、发送方、发送时间。在这里,所述消息标识为消息的标识号码,每一条消息对应一个消息标识。所述消息标识采用随时间变化的自增序列。
在获取到消息发送请求后,本发明实施例根据所述发送方的对象标识和接收方的对象标识,从聊天关系库中查询是否存在同时包括所述发送方的对象标识、接收方的对象标识的聊天关系,获取所述聊天关系对应的聊天关系标识。
在步骤s103中,若所述聊天关系库中存在对应的聊天关系标识及聊天关系,则根据所述聊天关系标识,将所述消息体保存至消息详情库中,并在所述消息详情库中记录所述消息体的消息标识、发送方的对象标识以及发送时间。
在本发明实施例中,每一聊天组的成员关系保存至聊天关系中,聊天组的消息内容保存至消息详情表;同一聊天组的聊天关系和消息详情表通过聊天关系标识关联起来。若经过步骤s102得到所述聊天关系库中存在对应的聊天关系标识及聊天关系,则消息详情库中必存在对应的消息详情表,根据所述聊天关系标识能够查询得到。
如前所述,所述消息标识采用随时间变化的自增序列。在保存消息体到消息详情表之前,本发明实施例首先将消息详情表中当前已存消息的消息标识的最大值加1,所得数值作为所述消息体的消息标识。然后关联所述消息体、消息标识、发送方的对象标识以及发送时间,并保存至所述消息详情表中。所述发送时间的格式为yyyymmddhhmmss,其中yyyy表示年,mm表示月,dd表示日,hh表示小时,mm表示分,ss表示秒,比如20171221135525。
示例性地,假设张三与李四组成聊天组,对应聊天关系标识a,张三的对象标识为user1,李四的对象标识为user2,两者对应的消息详情表中当前已存有4条消息。若张三在2018年01月21日10:10:10对李四发送消息“你好吗?”,则将消息详情表中当前已存储消息的消息标识的最大值加1,得到“5”作为该条消息“你好吗?”的消息标识。那么,关联并保存至所述消息详情表a中的内容包括:
消息标识:5;发送方的对象标识:user1;消息体:你好吗?;发送时间:20180121101010。
可见,在本发明实施例中,消息详情表中仅记录消息体,不记录聊天组的成员关系。
在步骤s104中,根据所述消息标识更新所述聊天关系中发送方的对象标识对应的删除游标取值和已读游标取值。
如前所述,所述聊天关系用于存储聊天组中的各用户对象的对象标识及其对应的状态信息。可选地,所述聊天关系中包括但不限于聊天关系标识、对象标识集、每一对象标识对应的状态信息。对象标识集中记录了聊天组的所有用户对象的对象标识。所述每一对象标识对应一状态栏,所述状态栏包括但不限于删除游标和已读游标。因此,每一对象标识对应的状态信息包括但不限于删除游标取值和已读游标取值。在本发明实施例中,所述删除游标取值和已读游标取值来源于消息标识,每一个对象标识对应的所述删除游标取值为用户对象在客户端上已删除消息的消息标识的最大值,每一对象标识对应的已读游标取值为用户对象在客户端上已读消息的消息标识的最大值。
在步骤s103保存消息体及其消息标识之后,进一步将所述聊天关系中发送方的对象标识对应的已读游标取值更新为消息详情表中已存消息的消息标识的最大值,删除游标取值保持不变。对于接收方,由于消息刚发出,在接收方并未产生消息拉取请求或消息删除请求的情况下,则保持已读游标取值和删除游标取值不变。
综上所述,本发明实施例提供了一种新的基于服务端存取的消息记录方式,使用户摆脱了设备的局限性;通过聊天关系库保存聊天组的成员关系及状态信息,消息详情库保存消息体,从而将聊天对象的关系和消息内容分开存储,每一条消息仅需存储一次,极大地节省了数据存储空间,消息存取更高效;通过聊天关系标识和删除游标、已读游标关联同一聊天组的聊天关系和消息详情表,既保证了聊天消息的一致性,也简化了消息读取及删除的处理逻辑;开发者可快速地从点对点聊天,扩展至群组聊天,减少需求变更造成的代码变更工作。
进一步地,在图1提供的消息的处理方法的第一实现流程的基础上,提出本发明实施例提供的消息的处理方法的第二实现流程。
如图2所示,是本发明实施例提供的消息的处理方法的第二实现流程示意图,所述处理方法还包括:
在步骤s105中,若所述聊天关系库中不存在对应的聊天关系标识及聊天关系,则在所述聊天关系库中创建所述发送方和接收方的对象标识对应的聊天关系,并生成所述聊天关系对应的聊天关系标识。
若经过步骤s102得到所述聊天关系库中不存在包括所述发送方和接收方的对象标识的聊天关系,表明当前发送方和接收方为一个新的聊天组,则为所述新的聊天组创建一个聊天关系,并生成对应的聊天关系标识。
可选地,可以采用java生成通用唯一识别码uuid(universallyuniqueidentifier),以所述通用唯一识别码uuid作为所述聊天关系标识。本发明实施例使用uuid,保证了所生成的聊天关系标识的唯一性。
在这里,所述聊天关系中包括聊天关系标识、对象标识集、每一对象标识对应的状态栏,具体请参见上述实施例的叙述,此处不再赘述。
在步骤s106中,关联所述聊天关系标识、发送方的对象标识和接收方的对象标识,并保存至所述聊天关系中。
在得到聊天关系后,将所述聊天关系标识、发送方的对象标识和接收方的对象标识保存至所述聊天关系中,其中,所述发送方的对象标识和接收方的对象标识写入所述聊天关系的对象标识集中。
在步骤s107中,初始化所述聊天关系中每一对象标识对应的删除游标取值和已读游标取值。
如前所述,在所述聊天关系中,所述每一对象标识对应一状态栏,所述状态栏用于记录每一对象标识的状态信息。在本发明实施例中,所述状态信息包括但不限于删除游标和已读游标。在新建聊天关系后,进一步初始化所述聊天关系中每一对象标识对应的状态栏中的删除游标取值和已读游标取值。可选地,在所述聊天组发出并记录第一条消息之前,每一对象标识对应的删除游标取值和已读游标取值优选为0,从而方便了后续直接以消息标识记录每一个对象标识对应的已删除消息和已读消息,以及更新每一个对象标识对应的未删除消息和未读消息,有利于简化消息拉取及删除操作的处理逻辑,提高消息发送、拉取及删除操作的性能。
在为所述新的聊天组创建对应的聊天关系,并初始化聊天组成员的删除游标取值和已读游标取值后,继续执行步骤s103、s104,以将所述消息发送请求中的消息体保存至消息详情库中,以及在聊天关系库更新游标信息。
进一步地,在图1或图2提供的消息的处理方法的实现流程的基础上,提出本发明实施例提供的消息的处理方法的第三实现流程。
如图3所示,是本发明实施例提供的消息的处理方法的第三实现流程示意图,所述处理方法还包括:
在步骤s301中,获取消息列表拉取请求,所述消息列表拉取请求中包括请求方的对象标识。
在本发明实施例中,作为接收方的用户使用客户端在应用程序上接收消息时,客户端根据产生的刷新指令生成消息列表拉取请求。可选地,所述刷新指令可以通过登录应用程序、打开后台运行的应用程序或者按照预设的时间间隔等方式产生。服务端从客户端获取并解析所述消息列表拉取请求。在本发明实施例中,所述消息列表拉取请求包括请求方的对象标识。
在步骤s302中,从所述聊天关系库中查询包括所述请求方的对象标识的聊天关系及其对应的聊天关系标识。
在得到请求方的对象标识之后,将其与聊天关系库中的每一个聊天关系中的对象标识集进行比对,获取对象标识集中包括所述请求方的对象标识的聊天关系及其聊天关系标识。在这里,所获取到的聊天关系包括一个或者多个。
在步骤s303中,针对每一聊天关系标识,从对应的聊天关系中获取所述请求方的对象标识对应的删除游标取值和已读游标取值,根据所述删除游标取值从所述消息详情库中筛选出所述请求方的未删除消息,以及根据所述已读游标取值从所述消息详情库中筛选出所述请求方的未读消息。
在这里,本发明实施例遍历所获取到的每一个聊天关系,根据所述请求方的对象标识从所述对象标识对应的状态栏中获取对应的删除游标取值和已读游标取值,从而得到与所述请求方相关的聊天组以及请求方在每一聊天组中的消息接收情况、删除情况。
然后针对每一个聊天组,根据对应的聊天关系标识,从消息详情库中查询所述聊天组对应的消息详情表;并根据所述删除游标取值从所述消息详情表中筛选出所述对象标识的未删除消息,以及根据所述已读游标取值从所述消息详情表中筛选出所述对象标识的未读消息。具体地,本发明实施例将删除游标取值加1后的消息标识至消息详情表中的消息标识的最大值对应的消息抽取出来,作为未删除消息;以及将已读游标取值加1后的消息标识至消息详情表中的消息标识的最大值对应的消息抽取出来,作为未读消息。
示例性地,假设聊天关系库中包括三个聊天关系:
其一为张三与李四组成的聊天组,对应聊天关系标识a,对象标识集包括:张三的对象标识user1、李四的对象标识user2。user1(张三)对应的已读游标取值为3、删除游标取值为3,user2(李四)对应的已读游标取值为0、删除游标取值为0。聊天组对应的消息详情表中当前已存有10条消息,消息标识的最大值为10。
其二为张三与王五组成的聊天组,对应聊天关系标识b,对象标识集包括:张三的对象标识user1、王五的对象标识user3。user1(张三)对应的已读游标取值为8、删除游标取值为4,user3(王五)对应的已读游标取值为5、删除游标取值为5。聊天组对应的消息详情表中当前已存有20条消息,消息标识的最大值为20。
其三为李四、王五与赵六组成的聊天组,对应聊天关系标识c,对象标识集包括:李四的对象标识user2、王五的对象标识user3、赵六的对象标识user4。user2(李四)对应的已读游标取值为40、删除游标取值为40,user3(王五)对应的已读游标取值为36、删除游标取值为28,user4(赵六)对应的已读游标取值为45、删除游标取值为40。聊天组对应的消息详情表中当前已存有45条消息,消息标识的最大值为45。
那么,当获取到请求方为张三的消息列表拉取请求时,查询聊天关系库得到与所述请求方张三的对象标识user1相关的关系包括聊天关系a和聊天关系b。针对聊天关系a,user1(张三)对应的已读游标取值为3,那么未读消息包括消息标识4至10对应的消息;user1(张三)对应的删除游标取值为3,那么未删除消息包括消息标识4至10对应的消息。针对聊天关系b,user1(张三)对应的已读游标取值为8,那么未读消息包括消息标识9至20对应的消息;user1(张三)对应的删除游标取值为4,那么未删除消息包括消息标识5至20对应的消息。
在步骤s304中,将所有聊天关系标识及请求方对应的未删除消息、未读消息封装为第一对外消息,将所述第一对外消息发送至所述请求方。
在按照请求方的对象标识从消息详情库中查询出未读消息和未删除消息后,将所述未删除消息和未读消息的消息体、发送方的对象标识以及发送时间封装为第一对外消息。
示例性地,如前所述示例,服务端将user1(张三)在聊天关系a中的未读消息(消息标识4至10对应的消息)和未删除消息(消息标识4至10对应的消息)的消息体、发送方的对象标识以及发送时间,以及将user1(张三)在聊天关系b中的未读消息(消息标识9至20对应的消息)和未删除消息(消息标识5至20对应的消息)的消息体、发送方的对象标识以及发送时间,作为消息体封装为第一对外消息。
可选地,所述第一对外消息可以为json格式的数据串,然后通过httpresponse接口将所述第一对外消息发送至请求方所使用的客户端设备。
综上所述,本发明实施例通过聊天关系库保存聊天组的成员关系及状态信息,消息详情库保存消息体,从而将聊天对象的关系和消息内容分开存储,每一条消息仅需存储一次,极大地节省了数据存储空间;然后基于游标方式进行已读、已删除消息的判断,以及未读、未删除消息的读取,完成消息列表的拉取,提高了消息列表拉取的性能,极大地简化了消息列表拉取的处理流程。
进一步地,在图1或图2提供的消息的处理方法的实现流程的基础上,提出本发明实施例提供的消息的处理方法的第四实现流程。
如图4所示,是本发明实施例提供的消息的处理方法的第四实现流程示意图,所述处理方法还包括:
在步骤s401中,获取消息删除请求,所述消息删除请求中包括请求方的对象标识、待处理的聊天关系标识以及已删除消息。
在本发明实施例中,任意用户使用客户端在应用程序上删除历史消息时,客户端根据产生的删除指令生成消息删除请求。可选地,所述删除指令可以通过触发单条消息的删除标识、消息列表清除标识或者按照预设的时间间隔等方式产生。服务端从客户端获取并解析所述消息删除请求。在本发明实施例中,所述消息删除请求中包括请求方的对象标识、待处理的聊天关系标识以及已删除消息。所述待处理的聊天关系标识与删除操作时所停留在的聊天窗口对应,所述已删除消息为用户对象在客户端上删除操作对应的执行对象。
在步骤s402中,从所述聊天关系库中查询所述待处理的聊天关系标识对应的聊天关系,作为待处理的聊天关系。
在得到待处理的聊天关系标识之后,将其与聊天关系库中的每一个聊天关系的聊天关系标识进行比对,以从聊天关系库中定位具有相同的聊天关系标识的聊天关系,作为待处理的聊天关系。
在步骤s403中,将所述待处理的聊天关系中的所述请求方的对象标识对应的删除游标取值更新为所述已删除消息的消息标识的最大值。
在本发明实施例中,对于用户对象在客户端发起的删除请求时,服务端执行删除操作时并不删除消息详情库中的消息内容,而是针对单个用户对象改变其对应的删除游标的取值,从而保证了存储在服务器上的消息的唯一性,即使聊天组内某一用户对象删除消息,其他用户对象仍可以从服务器查看到其未删除的消息。
在这里,当所述消息删除请求中的已删除消息仅有一条时,以所述已删除消息的消息标识作为所述请求方的对象标识对应的删除游标取值;当所述消息删除请求中的已删除消息有多条时,从所述多条已删除消息对应的消息标识中获取最大值,以所述消息标识的最大值作为所述请求方的对象标识对应的删除游标取值。
示例性地,假设聊天关系库中张三与李四组成的聊天组,对应聊天关系标识a,对象标识集包括:张三的对象标识user1、李四的对象标识user2。user1(张三)对应的已读游标取值为3、删除游标取值为3,user2(李四)对应的已读游标取值为10、删除游标取值为0。聊天组对应的消息详情表中当前已存有10条消息,消息标识的最大值为10。
那么,当获取到请求方李四通过触发消息列表清除标识产生的消息删除请求时,所述消息删除请求中包括请求方的对象标识(user2)、待处理的聊天关系标识(a)以及已删除消息(包括消息标识1至10的消息体、发送时间等),在聊天关系库中定位所述聊天关系标识a对应的聊天关系,将所述聊天关系中的所述请求方的对象标识(user2)对应的删除游标取值更新为所述已删除消息的消息标识的最大值,即消息标识10。后续进行消息列表拉取或消息拉取时,将按照更新后的删除游标取值拉取相关的数据。
本发明实施例通过聊天关系库保存聊天组的成员关系及状态信息,消息详情库保存消息体,从而将聊天对象的关系和消息内容分开存储,每一条消息仅需存储一次,极大地节省了数据存储空间,且消息存取更高效;然后基于游标方式进行消息删除的判断及更新,通过更新聊天关系中的删除游标取值,实现了在服务端维护单一用户对象的已删除消息,且不妨碍其他用户对象读取该已删除消息,保证了聊天消息的一致性,极大地简化了消息删除的处理流程。
进一步地,在图1或图2提供的消息的处理方法的实现流程的基础上,提出本发明实施例提供的消息的处理方法的第五实现流程。
如图5所示,是本发明实施例提供的消息的处理方法的第五实现流程示意图,所述处理方法还包括:
在步骤s501中,获取消息拉取请求,所述消息拉取请求中包括请求方的对象标识、待处理的聊天关系标识。
在本发明实施例中,任意用户使用客户端在应用程序上刷新消息时,客户端根据产生的刷新指令生成消息拉取请求。可选地,所述刷新指令可以通过点击打开聊天组的聊天窗口或者按照预设的时间间隔等方式产生。服务端从客户端获取并解析所述消息拉取请求。在本发明实施例中,所述消息拉取请求中包括请求方的对象标识、待处理的聊天关系标识。所述待处理的聊天关系标识与用户所打开的聊天组的聊天窗口对应。
在步骤s502中,从所述聊天关系库中查询所述待处理的聊天关系标识对应的聊天关系,从所查询到的聊天关系中读取所述请求方的对象标识对应的已读游标取值。
在得到待处理的聊天关系标识之后,将其与聊天关系库中的每一个聊天关系的聊天关系标识进行比对,以从聊天关系库中定位具有相同的聊天关系标识的聊天关系;然后从所获取的聊天关系中定位所述请求方的对象标识,读取对应的已读游标取值。
在步骤s503中,根据所述待处理的聊天关系标识、已读游标取值从所述消息详情库中筛选出所述请求方的未读消息。
在得到请求方的对象标识对应的已读游标取值之后,根据所述待处理的聊天关系标识从消息详情库中定位对应的消息详情表;然后使用所述已读游标取值,从所述消息详情表中筛选出所述对象标识的未读消息。具体地,本发明实施例将已读游标取值加1后的消息标识至消息详情表中的消息标识的最大值对应的消息抽取出来,作为未读消息。
示例性地,假设聊天关系库中张三与李四组成的聊天组,对应聊天关系标识a,对象标识集包括:张三的对象标识user1、李四的对象标识user2。user1(张三)对应的已读游标取值为3、删除游标取值为3,user2(李四)对应的已读游标取值为10、删除游标取值为0。聊天组对应的消息详情表中当前已存有10条消息,消息标识的最大值为10。
那么,当获取到请求方张三通过打开聊天窗口的方式产生的消息拉取请求时,所述消息拉取请求中包括请求方的对象标识(user1)、待处理的聊天关系标识(a),在聊天关系库中定位所述聊天关系标识a对应的聊天关系,获取所述聊天关系中的所述请求方的对象标识(user1)对应的已读游标取值3,将已读游标取值加1后的消息标识4至消息详情表中的消息标识的最大值10对应的消息抽取出来,即消息标识4至10对应的消息作为未读消息。
在步骤s504中,将所述聊天关系标识、请求方的对象标识及未读消息封装为第二对外消息,将所述第二对外消息发送至所述请求方。
在按照请求方的对象标识从消息详情库中查询出未读消息后,将所述未读消息的消息体、发送方的对象标识以及发送时间封装为第二对外消息。
示例性地,如前述示例,服务端将user1(张三)在聊天关系a中的未读消息(消息标识4至10对应的消息)的消息体、发送方的对象标识以及发送时间,作为消息体封装为第二对外消息。
可选地,所述第二对外消息可以为json格式的数据串,然后通过httpresponse接口将所述第二对外消息发送至请求方所使用的客户端设备。
需要注意的是,消息拉取请求是针对单一用户对象的单个聊天组拉取未读消息,所拉取的内容包括消息体、发送时间,以更新聊天组对应的聊天窗口;消息列表拉取请求是针对单一用户对象的所有聊天组拉取未读消息和未删除消息,所拉取的内容包括消息体、发送时间以及消息数目,以更新用户对象的聊天列表。
可选地,作为本发明的一个优选示例,在根据所述待处理的聊天关系标识、已读游标取值从所述消息详情库中筛选出所述请求方的未读消息之后,所述处理方法还包括:
在步骤s505中,将所查询到的聊天关系中的所述请求方的对象标识对应的已读游标取值更新为所筛选出的未读消息的消息标识的最大值。
在这里,当所拉取的未读消息仅有一条时,以所述未读消息的消息标识作为所述请求方的对象标识对应的已读游标取值;当所拉取的未读消息有多条时,从所述多条未读消息对应的消息标识中获取最大值,以所述消息标识的最大值作为所述请求方的对象标识对应的已读游标取值。
示例性地,如前述张三和李四组成的聊天组,将对应聊天关系中的所述请求方的对象标识(user1)对应的已读游标取值更新为所述未读消息的消息标识的最大值,即消息标识10。
本发明实施例通过聊天关系库保存聊天组的成员关系及状态信息,消息详情库保存消息体,从而将聊天对象的关系和消息内容分开存储,每一条消息仅需存储一次,极大地节省了数据存储空间,且消息存取更高效;然后基于游标方式完成消息拉取的判断及更新,并通过更新聊天关系中的已读游标取值,实现了在服务端维护单一用户对象的已读消息,保证了聊天消息的一致性,极大地简化了消息拉取的处理流程。
应理解,在上述实施例中,各步骤的序号的大小并不意味着执行顺序的先后,各步骤的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
实施例2
图6示出了本发明实施例提供的消息的处理装置的第一组成结构图,为了便于说明,仅示出了与本发明实施例相关的部分。
在本发明实施例中,所述消息的处理装置用于实现上述图1、图2、图3图4或图5实施例中所述的消息的处理方法,可以是内置于计算机设备的软件单元、硬件单元或者软硬件结合的单元。所述计算机设备可以为后台服务器。可选地,所述消息包括但不限于短信、社交类应用程序中的聊天消息、站内信。
参阅图6,所述消息的处理装置包括:
消息获取模块601,用于获取消息发送请求,所述消息发送请求中包括发送方的对象标识、接收方的对象标识以及消息体;
关系查询模块602,用于根据所述发送方的对象标识和接收方的对象标识,从聊天关系库中查询对应的聊天关系标识及聊天关系;
消息保存模块603,用于若所述聊天关系库中存在对应的聊天关系标识及聊天关系,则根据所述聊天关系标识,将所述消息体保存至消息详情库中,并在所述消息详情库中记录所述消息体的消息标识、发送方的对象标识以及发送时间;
游标更新模块604,用于根据所述消息标识更新所述聊天关系中发送方的对象标识对应的删除游标取值和已读游标取值。
进一步地,所述处理装置还包括:
关系创建模块605,用于若所述聊天关系库中不存在对应的聊天关系标识及聊天关系,则在所述聊天关系库中创建所述发送方和接收方的对象标识对应的聊天关系,并生成所述聊天关系对应的聊天关系标识;
关联存储模块606,用于关联所述聊天关系标识、发送方的对象标识和接收方的对象标识,并保存至所述聊天关系中;
初始化模块607,用于初始化所述聊天关系中每一对象标识对应的删除游标取值和已读游标取值。
进一步地,所述处理装置还包括:
第一请求获取模块611,用于获取消息列表拉取请求,所述消息列表拉取请求中包括请求方的对象标识;
第一查询模块612,用于从所述聊天关系库中查询包括所述请求方的对象标识的聊天关系及其对应的聊天关系标识;
第一筛选模块613,用于针对每一聊天关系标识,从对应的聊天关系中获取所述请求方的对象标识对应的删除游标取值和已读游标取值,根据所述删除游标取值从所述消息详情库中筛选出所述请求方的未删除消息,以及根据所述已读游标取值从所述消息详情库中筛选出所述请求方的未读消息;
第一封装模块614,用于将所有聊天关系标识及请求方对应的未删除消息、未读消息封装为第一对外消息,将所述第一对外消息发送至所述请求方。
进一步地,所述处理装置还包括:
第二请求获取模块621,用于获取消息拉取请求,所述消息拉取请求中包括请求方的对象标识、待处理的聊天关系标识;
第二查询模块622,用于从所述聊天关系库中查询所述待处理的聊天关系标识对应的聊天关系,从所查询到的聊天关系中读取所述请求方的对象标识对应的已读游标取值;
第二筛选模块623,用于根据所述待处理的聊天关系标识、已读游标取值从所述消息详情库中筛选出所述请求方的未读消息;
第二封装模块624,用于将所述聊天关系标识、请求方的对象标识及未读消息封装为第二对外消息,将所述第二对外消息发送至所述请求方。
进一步地,所述处理装置还包括:
已读游标更新模块625,用于将所查询到的聊天关系中的所述请求方的对象标识对应的已读游标取值更新为所筛选出的未读消息的消息标识的最大值。
进一步地,所述处理装置还包括:
第三请求获取模块631,用于获取消息删除请求,所述消息删除请求中包括请求方的对象标识、待处理的聊天关系标识以及已删除消息;
第三查询模块632,用于从所述聊天关系库中查询所述待处理的聊天关系标识对应的聊天关系,作为待处理的聊天关系;
删除游标更新模块633,用于将所述待处理的聊天关系中的所述请求方的对象标识对应的删除游标取值更新为所述已删除消息的消息标识的最大值。
需要说明的是,本发明实施例中的各模块/单元可以用于实现上述图1、图2、图3、图4或图5所述的方法实施例中的全部技术方案,其具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
实施例3
本实施例提供一计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现实施例1中消息的处理方法,为避免重复,这里不再赘述。或者,该计算机程序被处理器执行时实现实施例2中消息的处理装置中各模块/单元的功能,为避免重复,这里不再赘述。
可以理解地,所述计算机可读存储介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、电载波信号和电信信号等。
实施例4
图7是本发明实施例提供的一种计算机设备的示意图。如图7所示,该实施例的计算机设备7包括:处理器70、存储器71以及存储在所述存储器71中并可在所述处理器70上运行的计算机程序72。所述处理器70执行所述计算机程序72时实现上述实施例1中消息的处理方法的步骤,例如图1所示的步骤s101至s104,图2实施例中所述的步骤s105至步骤s107,图3实施例中所述的步骤s301至s304以及图4实施例中所述的步骤s401至步骤s403,图5实施例中所述的步骤s501至步骤s505,或者,所述处理器70执行所述计算机程序72时实现上述实施例2中所述的消息的处理装置中的各模块/单元的功能,例如图6所示模块601至607的功能。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。
以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。