一种私信存储方法及系统转让专利

申请号 : CN201610265245.6

文献号 : CN107315745B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 周默季周张燕锋芮雪

申请人 : 北京京东尚科信息技术有限公司

摘要 :

本发明公开了一种私信存储方法,该方法包括:为私信创建三级索引结构,所述三级索引结构包括:一级索引、二级索引和三级索引;根据所述三级索引结构对私信进行存储;其中,所述一级索引为通过对用户标识进行映射得到第一键值;通过对用户标识进行一致性哈希算法得到第一键值的索引地址;所述二级索引为通过对用户标识和会话标识进行映射得到第二键值;通过对用户标识进行一致性哈希算法得到第二键值的索引地址;所述三级索引为通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址。本发明还公开了一种私信存储系统。采用本发明能够解放关系型数据库的读写压力。

权利要求 :

1.一种私信存储方法,该方法包括:

为私信创建三级索引结构,所述三级索引结构包括:一级索引、二级索引和三级索引;

根据所述三级索引结构对私信进行存储;

其中,所述一级索引为通过对用户标识进行映射得到第一键值;通过对用户标识进行一致性哈希算法得到第一键值的索引地址;

所述二级索引为通过对用户标识和会话标识进行映射得到第二键值;通过对用户标识进行一致性哈希算法得到第二键值的索引地址;

所述三级索引为通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址。

2.如权利要求1所述的方法,其特征在于,根据所述三级索引结构对私信进行存储的方法包括:通过对发送者用户标识进行映射得到发送者用户标识对应的第一键值;通过对发送者用户标识进行一致性哈希算法得到发送者用户标识对应的第一键值的索引地址;将会话标识写入发送者用户标识对应的第一键值索引地址中;

通过对发送者用户标识和会话标识进行映射得到发送者会话标识对应的第二键值;通过对发送者用户标识进行一致性哈希算法得到发送者会话标识对应的第二键值的索引地址;将私信主键写入发送者会话标识对应的第二键值索引地址中;

通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址;将私信内容写入第三键值索引地址中;

同时,通过对接收者用户标识进行映射得到接收者用户标识对应的第一键值;通过对接收者用户标识进行一致性哈希算法得到接收者用户标识对应的第一键值的索引地址;将会话标识写入接收者用户标识对应的第一键值索引地址中;

通过对接收者用户标识和会话标识进行映射得到接收者会话标识对应的第二键值;通过对接收者用户标识进行一致性哈希算法得到接收者会话标识对应的第二键值的索引地址;将私信主键写入接收者会话标识对应的第二键值索引地址中;

通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址;将私信内容写入第三键值索引地址中。

3.如权利要求2所述的方法,其特征在于,该方法进一步包括对存储的私信进行读取,具体为:通过对发送者/接收者用户标识进行映射得到发送者/接收者用户标识对应的第一键值;通过对发送者/接收者用户标识进行一致性哈希算法得到发送者/接收者用户标识对应的第一键值的索引地址;将会话标识从发送者/接收者用户标识对应的第一键值索引地址中读取出来;

通过对发送者/接收者用户标识和会话标识进行映射得到发送者/接收者会话标识对应的第二键值;通过对发送者/接收者用户标识进行一致性哈希算法得到发送者/接收者会话标识对应的第二键值的索引地址;将私信主键从发送者/接收者会话标识对应的第二键值索引地址中读取出来;

通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址;将私信内容从第三键值索引地址中读取出来。

4.如权利要求3所述的方法,其特征在于,每个键值索引地址对应有一组物理存储节点,该组物理存储节点包括通过链表依次链接的一个主节点和其余多个从节点;

在进行存储操作时,该方法进一步包括:从主节点开始,依次在该键值索引地址所对应的每个物理存储节点上进行写操作;

或者,在进行读取操作时,该方法进一步包括:对根据权重从该键值索引地址所对应的所有物理存储节点中选择出的一个物理存储节点进行读操作。

5.如权利要求1所述的方法,其特征在于,采用有序集合作为一级索引的数据结构;采用列表作为存储二级索引的数据结构。

6.如权利要求4所述的方法,其特征在于,当主节点故障时,将链表中距离主节点最近的从节点作为新的主节点;当从节点故障时,修改链表中位于故障从节点前一个节点的链表指针,将所述链表指针指向故障从节点的后一个节点。

7.如权利要求2所述的方法,其特征在于,该方法进一步包括:

定期扫描存储的第三键值,查找到超过预定时间的第三键值;

在超过预定时间的第三键值所对应的私信内容中设置私信内容删除标志位,用于在缓存空间达到阈值时,将设置有删除标志位的私信内容删除。

8.如权利要求2所述的方法,其特征在于,所述私信内容中包括私信过期时间,该方法进一步包括:定时查找预定时间段内的第三键值,获取所对应的私信内容中的过期时间;将超过过期时间的私信内容删除;

或者,定期查找预定时间段内的私信主键,通过对私信主键进行映射得到第三键值,获取所对应的私信内容中的过期时间;将超过过期时间的私信内容删除;

或者,通过随机函数随机生成私信主键,通过对私信主键进行映射得到第三键值,获取所对应的私信内容中的过期时间;将超过过期时间的私信内容删除;

或者,根据用户输入的读取请求,将读取到的超过过期时间的私信内容删除。

9.如权利要求2所述的方法,其特征在于,该方法进一步包括:

在进行冷启动或者水平扩容时,为缓存空间中的每个用户设置加载标志位,并删除建立的三级索引;

在冷启动或者水平扩容后,存储模块接收到用户的存储操作或者读取操作请求时,将设置有加载标志位的用户的私信内容从数据库中加载到当前缓存空间,根据当前缓存空间重建三级索引后,删除所设置的加载标志位。

10.如权利要求2所述的方法,其特征在于,该方法进一步包括:

定时将数据库中的私信内容与缓存空间中的私信内容进行比较,按照数据库中的私信内容同步缓存空间中的私信内容。

11.一种私信存储系统,该系统包括存储模块和缓存模块,所述存储模块包括索引创建单元和存储单元;

所述索引创建单元,为私信创建三级索引结构,所述三级索引结构包括:一级索引、二级索引和三级索引;

所述存储单元,根据所述三级索引结构对私信进行存储,将私信存储到缓存模块中;

其中,所述一级索引为通过对用户标识进行映射得到第一键值;通过对用户标识进行一致性哈希算法得到第一键值的索引地址;

所述二级索引为通过对用户标识和会话标识进行映射得到第二键值;通过对用户标识进行一致性哈希算法得到第二键值的索引地址;

所述三级索引为通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址。

12.如权利要求11所述的系统,其特征在于,存储单元具体用于,

通过对发送者用户标识进行映射得到发送者用户标识对应的第一键值;通过对发送者用户标识进行一致性哈希算法得到发送者用户标识对应的第一键值的索引地址;将会话标识写入发送者用户标识对应的第一键值索引地址中;

通过对发送者用户标识和会话标识进行映射得到发送者会话标识对应的第二键值;通过对发送者用户标识进行一致性哈希算法得到发送者会话标识对应的第二键值的索引地址;将私信主键写入发送者会话标识对应的第二键值索引地址中;

通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址;将私信内容写入第三键值索引地址中;

同时,通过对接收者用户标识进行映射得到接收者用户标识对应的第一键值;通过对接收者用户标识进行一致性哈希算法得到接收者用户标识对应的第一键值的索引地址;将会话标识写入接收者用户标识对应的第一键值索引地址中;

通过对接收者用户标识和会话标识进行映射得到接收者会话标识对应的第二键值;通过对接收者用户标识进行一致性哈希算法得到接收者会话标识对应的第二键值的索引地址;将私信主键写入接收者会话标识对应的第二键值索引地址中;

通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址;将私信内容写入第三键值索引地址中。

13.如权利要求12所述的系统,其特征在于,所述存储模块进一步包括读取单元,对存储的私信进行读取,具体用于:通过对发送者/接收者用户标识进行映射得到发送者/接收者用户标识对应的第一键值;通过对发送者/接收者用户标识进行一致性哈希算法得到发送者/接收者用户标识对应的第一键值的索引地址;将会话标识从发送者/接收者用户标识对应的第一键值索引地址中读取出来;

通过对发送者/接收者用户标识和会话标识进行映射得到发送者/接收者会话标识对应的第二键值;通过对发送者/接收者用户标识进行一致性哈希算法得到发送者/接收者会话标识对应的第二键值的索引地址;将私信主键从发送者/接收者会话标识对应的第二键值索引地址中读取出来;

通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址;将私信内容从第三键值索引地址中读取出来。

14.如权利要求13所述的系统,其特征在于,缓存模块中包括多个物理存储节点组,每个键值索引地址对应有一组物理存储节点,该组物理存储节点包括通过链表依次链接的一个主节点和其余多个从节点;

在进行存储操作时,存储单元还用于:从主节点开始,依次在该键值索引地址所对应的每个物理存储节点上进行写操作;

或者,在进行读取操作时,读取单元还用于:对根据权重从该键值索引地址所对应的所有物理存储节点中选择出的一个物理存储节点进行读操作。

15.如权利要求14所述的系统,其特征在于,该系统还包括控制模块,所述控制模块中包括主从调度单元,用于当主节点故障时,将链表中距离主节点最近的从节点作为新的主节点;当从节点故障时,修改链表中位于故障从节点前一个节点的链表指针,将所述链表指针指向故障从节点的后一个节点。

16.如权利要求15所述的系统,其特征在于,所述控制模块还包括缓存空间动态规划单元,定期扫描存储的第三键值,查找到超过预定时间的第三键值;

在超过预定时间的第三键值所对应的私信内容中设置私信内容删除标志位,用于在缓存空间达到阈值时,将设置有删除标志位的私信内容删除。

17.如权利要求15所述的系统,其特征在于,所述私信内容中包括私信过期时间,所述控制模块还包括数据清洗单元,定时查找预定时间段内的第三键值,获取所对应的私信内容中的过期时间;将超过过期时间的私信内容删除;

或者,定期查找预定时间段内的私信主键,通过对私信主键进行映射得到第三键值,获取所对应的私信内容中的过期时间;将超过过期时间的私信内容删除;

或者,通过随机函数随机生成私信主键,通过对私信主键进行映射得到第三键值,获取所对应的私信内容中的过期时间;将超过过期时间的私信内容删除;

或者,根据用户输入的读取请求,将读取到的超过过期时间的私信内容删除。

18.如权利要求15所述的系统,其特征在于,所述控制模块还包括标志位加载单元,在进行冷启动或者水平扩容时,为缓存空间中的每个用户设置加载标志位,并删除建立的三级索引;

在冷启动或者水平扩容后,存储模块接收到用户的存储操作或者读取操作请求时,将设置有加载标志位的用户的私信内容从数据库中加载到当前缓存空间,根据当前缓存空间重建三级索引后,删除所设置的加载标志位。

19.如权利要求15所述的系统,其特征在于,所述控制模块还包括数据容错单元,用于定时将数据库中的私信内容与缓存空间中的私信内容进行比较,按照数据库中的私信内容同步缓存空间中的私信内容。

20.一种服务器,包括:

一个或多个处理器;

存储装置,用于存储一个或多个程序,

当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-10中任一所述的方法。

21.一种计算机可读存储介质,其上存储有计算机程序,其中,所述程序被处理器执行时实现如权利要求1-10中任一所述的方法。

说明书 :

一种私信存储方法及系统

技术领域

[0001] 本发明涉及数据存储技术领域,特别涉及一种私信存储方法及系统。

背景技术

[0002] 现有的关系型数据库技术可以实现对私信内容以及收发关系的存储,但是当系统读写非常频繁的时候,数据库的输入输出(IO)性能不足以承载如此庞大的每秒钟系统能够处理的交易的数量(TPS),经常会产生响应延迟很大,甚至直接导致数据库宕机。

发明内容

[0003] 本发明的目的在于提供一种私信存储方法及系统,能够解放关系型数据库的读写压力。
[0004] 为实现上述发明目的,本发明提供了一种私信存储方法,该方法包括:
[0005] 为私信创建三级索引结构,所述三级索引结构包括:一级索引、二级索引和三级索引;
[0006] 根据所述三级索引结构对私信进行存储;
[0007] 其中,所述一级索引为通过对用户标识进行映射得到第一键值;通过对用户标识进行一致性哈希算法得到第一键值的索引地址;
[0008] 所述二级索引为通过对用户标识和会话标识进行映射得到第二键值;通过对用户标识进行一致性哈希算法得到第二键值的索引地址;
[0009] 所述三级索引为通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址。
[0010] 为实现上述发明目的,本发明还提供了一种私信存储系统,该系统包括存储模块和缓存模块,所述存储模块包括索引创建单元和存储单元;
[0011] 所述索引创建单元,为私信创建三级索引结构,所述三级索引结构包括:一级索引、二级索引和三级索引;
[0012] 所述存储单元,根据所述三级索引结构对私信进行存储,将私信存储到缓存模块中;
[0013] 其中,所述一级索引为通过对用户标识进行映射得到第一键值;通过对用户标识进行一致性哈希算法得到第一键值的索引地址;
[0014] 所述二级索引为通过对用户标识和会话标识进行映射得到第二键值;通过对用户标识进行一致性哈希算法得到第二键值的索引地址;
[0015] 所述三级索引为通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址。
[0016] 综上所述,本发明实施例提供的私信存储方法及系统,在对私信进行存储时,根据预先建立的三级索引结构进行。如此,本发明的方案能够独立于传统的关系型数据库之上,提供高效的读写服务,并保证数据的一致性和系统的高可用性。

附图说明

[0017] 图1为本发明实施例私信存储方法的流程示意图。
[0018] 图2为针对同一个会话,在缓存模块中进行存储的示意图。
[0019] 图3为一个物理存储节点组中主从节点的示意图。
[0020] 图4为本发明实施例私信存储系统的结构示意图。

具体实施方式

[0021] 为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明所述方案作进一步地详细说明。
[0022] 本发明利用内存访问速度快的优势,结合业务特点,使用高效的三级索引机制,实现用户对私信列表的快速读写。另外存储系统还能够对存储空间的大小实现细粒度的控制,保证存储数据的最终一致性和系统的高可用性,同时也可以保证存储系统在最短的时间内实现冷启动或者重新加载。本发明中,私信指的是端到端的交互信息,双方之间交互的私信只有对方能看到,类似于微博,微信中双方之间交互的私信。
[0023] 为了能够解放关系型数据库的读写压力,本发明的私信存储系统,包括存储模块和缓存模块。存储模块进一步包括索引创建单元和存储单元。缓存模块中包括多个物理存储节点组,每个物理存储节点组中又可以包含多个物理存储节点。本发明的方案不需要关系型数据库,从而解放了关系型数据库的读写压力,正常情况下,本私信存储系统可以取代数据库独立负责私信读写服务。
[0024] 本发明实施例私信存储方法的流程示意图如图1所示,包括以下步骤:
[0025] 步骤11、为私信创建三级索引结构,所述三级索引结构包括:一级索引、二级索引和三级索引;
[0026] 步骤12、根据所述三级索引结构对私信进行存储。
[0027] 其中,所述一级索引为通过对用户标识进行映射得到第一键值;通过对用户标识进行一致性哈希算法得到第一键值的索引地址;
[0028] 所述二级索引为通过对用户标识和会话标识进行映射得到第二键值;通过对用户标识进行一致性哈希算法得到第二键值的索引地址;
[0029] 所述三级索引为通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址。
[0030] 写操作
[0031] 首先,索引创建单元建立三级索引结构,以及负载均衡单元获取系统中物理存储节点的拓扑结构,当用户发起存储请求的时候,存储单元根据接收到携带有发送者用户标识和接收者用户标识的存储请求进行存储。同一个业务、发送者和接收者唯一地确定一个会话,发送者和接收者共享该会话标识。发送者和接收者分别根据三级索引结构进行存储的过程如下:
[0032] 对于发送者
[0033] 1)通过对发送者用户标识进行映射得到发送者用户标识对应的第一键值;通过对发送者用户标识进行一致性哈希算法得到发送者用户标识对应的第一键值的索引地址,该索引地址是一个物理存储节点组的编号;
[0034] 根据拓扑结构找到该物理存储节点组,在该物理存储节点组对应的每个物理存储节点上,将由全局序列发生器自动生成的会话标识写入以发送者用户标识对应的第一键值为数据结构名称的数据结构中。其中,采用有序集合(Set)作为一级索引的数据结构。
[0035] 使用有序Set作为存储一级索引(会话索引)的数据结构,一方面可以天然地支持会话排重,另一方面可以保存会话的先后顺序。具体地,有序Set使用跳表实现,以会话的序列号作为score,虽然对随机访问的支持并不是特别出色,但考虑到私信的特殊业务特点,用户往往只关心最近的几页会话,因此主要查询压力落到了有序Set的前几页,在大量访问的场景下,不会产生太严重的性能问题。
[0036] 优选地,由于每个物理存储节点组采用一主多从的链式结构,即,每个物理存储节点组包括通过链表依次链接的一个主节点和其余多个从节点。所以,负载均衡单元查找到主节点,存储单元从主节点开始,依次在该物理存储节点组对应的每个物理存储节点上,进行上述写操作。
[0037] 2)通过对发送者用户标识和会话标识进行映射得到发送者会话标识对应的第二键值;通过对发送者用户标识进行一致性哈希算法得到发送者会话标识对应的第二键值的索引地址,该索引地址是一个物理存储节点组的编号,由于一级索引和二级索引都是采用发送者用户标识进行一致性哈希算法,所以得到的第二键值的索引地址相同。
[0038] 根据拓扑结构找到该物理存储节点组,在该物理存储节点组对应的每个物理存储节点上,将由全局序列发生器自动生成的私信主键写入以发送者会话标识对应的第二键值为数据结构名称的数据结构中。其中,采用列表(List)作为存储二级索引的数据结构。
[0039] 使用List作为存储二级索引(私信主键索引)的数据结构,因为私信只需要保持其顺序,而无需考虑重复情况。具体地,List使用链表实现,因为在具体业务场景下,用户只会加载最近的几条私信,历史记录可以通过瀑布流的方式加载,所以不会出现随机访问的情况。特别地,需要额外增加字段记录会话内的未读私信数,保证其查询复杂度为O(1),用于支持实际的用户应用场景。
[0040] 优选地,由于每个物理存储节点组采用一主多从的链式结构,所以,负载均衡单元查找到主节点,存储单元从主节点开始,依次在该物理存储节点组对应的每个物理存储节点上,进行上述写操作。
[0041] 3)通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址,该索引地址是一个物理存储节点组的编号;
[0042] 根据拓扑结构找到该物理存储节点组,在该物理存储节点组对应的每个物理存储节点上,将私信内容写入以第三键值为数据结构名称的数据结构中。
[0043] 优选地,由于每个物理存储节点组采用一主多从的链式结构,所以,负载均衡单元查找到主节点,存储单元从主节点开始,依次在该物理存储节点组对应的每个物理存储节点上,进行上述写操作。
[0044] 对于接收者
[0045] 1)通过对接收者用户标识进行映射得到接收者用户标识对应的第一键值;通过对接收者用户标识进行一致性哈希算法得到接收者用户标识对应的第一键值的索引地址,该索引地址是一个物理存储节点组的编号;
[0046] 根据拓扑结构找到该物理存储节点组,在该物理存储节点组对应的每个物理存储节点上,将由全局序列发生器自动生成的会话标识写入以接收者用户标识对应的第一键值为数据结构名称的数据结构中。
[0047] 优选地,由于每个物理存储节点组采用一主多从的链式结构,所以,负载均衡单元查找到主节点,存储单元从主节点开始,依次在该物理存储节点组对应的每个物理存储节点上,进行上述写操作。
[0048] 2)通过对接收者用户标识和会话标识进行映射得到接收者会话标识对应的第二键值;通过对接收者用户标识进行一致性哈希算法得到接收者会话标识对应的第二键值的索引地址,该索引地址是一个物理存储节点组的编号,由于一级索引和二级索引都是采用接收者用户标识进行一致性哈希算法,所以得到的第二键值的索引地址相同。
[0049] 根据拓扑结构找到该物理存储节点组,在该物理存储节点组对应的每个物理存储节点上,将由全局序列发生器自动生成的私信主键写入以接收者会话标识对应的第二键值为数据结构名称的数据结构中。
[0050] 优选地,由于每个物理存储节点组采用一主多从的链式结构,所以,负载均衡单元查找到主节点,存储单元从主节点开始,依次在该物理存储节点组对应的每个物理存储节点上,进行上述写操作。
[0051] 3)通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址,该索引地址是一个物理存储节点组的编号;
[0052] 根据拓扑结构找到该物理存储节点组,在该物理存储节点组对应的每个物理存储节点上,将私信内容写入以第三键值为数据结构名称的数据结构中。
[0053] 优选地,由于每个物理存储节点组采用一主多从的链式结构,所以,负载均衡单元查找到主节点,存储单元从主节点开始,依次在该物理存储节点组对应的每个物理存储节点上,进行上述写操作。
[0054] 需要说明的是,会话标识是一个全局唯一的长整型数字,由全局序列发生器自动生成,用于表示一个会话。发送者和接收者共享同一个会话标识,发送者和接收者都是通过对会话标识进行一致性哈希算法得到第三键值的索引地址,所以,发送者和接收者得到的第三键值的索引地址是相同的。另外,私信主键也是一个全局唯一的长整型数字,由全局序列发生器自动生成,在同一个会话中,发送者和接收者之间的每一次交互,产生一个私信主键。
[0055] 读操作
[0056] 当用户发起读取请求的时候,读取单元根据当前用户携带的用户标识进行读取。同一个业务、发送者和接收者唯一地确定一个会话,发送者和接收者共享该会话标识。发送者或者接收者根据三级索引结构进行读取的过程如下:
[0057] 1)通过对发送者/接收者用户标识进行映射得到发送者/接收者用户标识对应的第一键值;通过对发送者/接收者用户标识进行一致性哈希算法得到发送者/接收者用户标识对应的第一键值的索引地址;将会话标识从发送者/接收者用户标识对应的第一键值索引地址中读取出来。
[0058] 优选地,由于每个物理存储节点组采用一主多从的链式结构,即,每个物理存储节点组包括通过链表依次链接的一个主节点和其余多个从节点。链表上的每一个节点都设置一个权值,所以,负载均衡单元可以使用加权轮询(WRR)机制,根据预先设置好的权重从该物理存储节点组中选择其中一个物理存储节点,然后读取单元进行读操作。从而保证了高并发访问下的可靠性。
[0059] 2)通过对发送者/接收者用户标识和会话标识进行映射得到发送者/接收者会话标识对应的第二键值;通过对发送者/接收者用户标识进行一致性哈希算法得到发送者/接收者会话标识对应的第二键值的索引地址;将私信主键从发送者/接收者会话标识对应的第二键值索引地址中读取出来;
[0060] 优选地,由于每个物理存储节点组采用一主多从的链式结构,链表上的每一个节点都设置一个权值,所以,负载均衡单元可以使用WRR机制,根据预先设置好的权重从该物理存储节点组中选择其中一个物理存储节点,然后读取单元进行读操作。
[0061] 3)通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址;将私信内容从第三键值索引地址中读取出来。
[0062] 优选地,由于每个物理存储节点组采用一主多从的链式结构,链表上的每一个节点都设置一个权值,所以,负载均衡单元可以使用WRR机制,根据预先设置好的权重从该物理存储节点组中选择其中一个物理存储节点,然后读取单元进行读操作。
[0063] 为清楚地说明本发明,下面列举具体场景进行说明。图2为针对同一个会话,在缓存模块中进行存储的示意图。发送者的用户标识为A,接收者的用户标识为B,全局序列发生器自动生成的会话标识为X。在同一个业务中,用户标识A和用户标识B之间的所有私信交互都属于同一个会话(用会话标识X表示)。本场景中,假设该会话中私信交互为三次,每次由全局序列发生器自动生成的私信主键分别为私信主键1、私信主键2和私信主键3。
[0064] 对于发送者
[0065] 对用户标识A进行映射得到第一键值,对用户标识A进行一致性哈希算法得到第一键值的存储位置,即所在的物理存储节点组。将会话标识X写入以用户标识A对应的第一键值为数据结构名称的数据结构中。
[0066] 对用户标识A和会话标识X进行映射得到第二键值,对用户标识A进行一致性哈希算法得到第二键值的存储位置,即所在的物理存储节点组。由于一级索引和二级索引都是采用用户标识A进行一致性哈希算法,第一键值和第二键值的存储位置相同。将私信主键1写入以用户标识A+会话标识X对应的第二键值为数据结构名称的数据结构中。
[0067] 对私信主键1进行映射得到第三键值,对会话标识X进行一致性哈希算法得到第三键值的存储位置,即所在的物理存储节点组。将私信内容写入以私信主键1对应的第三键值为数据结构名称的数据结构中。私信内容包括发信人、收信人、内容和过期时间等私信。
[0068] 同时,对于接收者
[0069] 对用户标识B进行映射得到第一键值,对用户标识B进行一致性哈希算法得到第一键值的存储位置,即所在的物理存储节点组。将会话标识X写入以用户标识B对应的第一键值为数据结构名称的数据结构中。
[0070] 对用户标识B和会话标识X进行映射得到第二键值,对用户标识B进行一致性哈希算法得到第二键值的存储位置,即所在的物理存储节点组。由于一级索引和二级索引都是采用用户标识B进行一致性哈希算法,第一键值和第二键值的存储位置相同。将私信主键1写入以用户标识B+会话标识X对应的第二键值为数据结构名称的数据结构中。
[0071] 对私信主键1进行映射得到第三键值,对会话标识X进行一致性哈希算法得到第三键值的存储位置,即所在的物理存储节点组。将私信内容写入以私信主键1对应的第三键值为数据结构名称的数据结构中。私信内容包括发信人、收信人、内容和过期时间等私信。由此可以看出,发送者和接收者共享以私信主键1对应的第三键值为数据结构名称的数据结构。
[0072] 以此类推,同样根据本发明的三级索引结构,将私信主键2写入以用户标识A+会话标识X对应的第二键值为数据结构名称的数据结构中;将私信主键2写入以用户标识B+会话标识X对应的第二键值为数据结构名称的数据结构中;将私信内容写入以私信主键2对应的第三键值为数据结构名称的数据结构中。
[0073] 以此类推,同样根据本发明的三级索引结构,将私信主键3写入以用户标识A+会话标识X对应的第二键值为数据结构名称的数据结构中;将私信主键3写入以用户标识B+会话标识X对应的第二键值为数据结构名称的数据结构中;将私信内容写入以私信主键3对应的第三键值为数据结构名称的数据结构中。
[0074] 由上述可以看出,本发明的私信存储系统可以取代数据库独立负责私信读写操作。另外,本发明还公开了一种私信存储系统下的控制方法,私信存储系统还包括控制模块,从而保证了缓存的数据一致性和高可用性,下面进行详细说明。
[0075] 控制方法一
[0076] 当主节点故障时,将链表中距离主节点最近的从节点作为新的主节点;当从节点故障时,修改链表中位于故障从节点前一个节点的链表指针,将所述链表指针指向故障从节点的后一个节点。
[0077] 图3为一个物理存储节点组中主从节点的示意图。当主节点故障时,将距离主节点最近的从节点1作为新主节点,继续提供读写服务。当从节点2故障时,直接修改从节点1的链表指针,使其指向从节点3,从而实现主从节点的动态移除。同理,当系统需要更高的可用性保障时,直接在链表末尾追加从节点即可。如此,就可以确保缓存中节点不会宕机,从而实现了系统高可用性。
[0078] 控制方法二
[0079] 为了更合理的利用缓存空间,控制模块提供了缓存空间动态规划机制,当系统缓存空间到达阀值时,强制淘汰那些比较久远的私信,并设置删除标志位。当用户通过分页方式重新请求这些私信时,再次从数据库中把它们加载进来。具体方法为:定期扫描存储的第三键值,查找到超过预定时间的第三键值;在超过预定时间的第三键值所对应的私信内容中设置私信内容删除标志位,用于在缓存空间达到阈值时,将设置有删除标志位的私信内容删除。从而实现了系统高可用性。
[0080] 其中,第三键值是带有时间戳的字符串,所以根据第三键值就可以确定私信已存时间了。在一个实施例中,可以预先设置缓存空间的存储阈值为70%。每天扫描存储的第三键值,将超过一周的第三键值所对应的私信内容中设置私信内容删除标志位。实时扫描缓存空间,当监控到缓存空间的存储阈值超过70%时,将设置有删除标志位的私信内容删除。
[0081] 控制方法三
[0082] 为了删除已过期或者存在异常的私信,实现数据一致性,可以根据私信内容中包含的私信过期时间进行控制,具体方法可以选择以下三种:
[0083] 第一种,
[0084] 定时查找预定时间段内的第三键值,获取所对应的私信内容中的过期时间;将超过过期时间的私信内容删除;
[0085] 或者,定期查找预定时间段内的私信主键,通过对私信主键进行映射得到第三键值,获取所对应的私信内容中的过期时间;将超过过期时间的私信内容删除。
[0086] 在一个实施例中,每天获取一周前一天内的第三键值,将该时间段内第三键值对应的私信内容取出来,假设当前时间为2016年3月22日,取出的一个私信内容中记录过期时间为:2016年3月21日,则将该超过过期时间的私信内容删除。
[0087] 或者,可选地,每天获取一周前一天内的私信主键,由于私信主键是由全局序列发生器产生,所以比较容易获得预定时间段内生成了哪些私信主键。所以,将该时间段内的私信主键经过映射得到对应的第三键值,再将第三键值对应的私信内容取出来,仍然假设当前时间为2016年3月22日,取出的一个私信内容中记录过期时间为:2016年3月21日,则将该超过过期时间的私信内容删除。
[0088] 第二种,
[0089] 通过随机函数随机生成私信主键,通过对私信主键进行映射得到第三键值,获取所对应的私信内容中的过期时间;将超过过期时间的私信内容删除。
[0090] 在一个实施例中,随机频率可以按需配置,通常情况下,当系统负载较低时,设置为每秒触发100次随机校验,此时能获得最好的数据清洗效果。
[0091] 第三种,
[0092] 根据用户输入的读取请求,将读取到的超过过期时间的私信内容删除。
[0093] 这种方式是用户主动校验,是指系统不保证全部的过期私信一定被删除,而是在用户发出查询请求时进行校验,对那些异常的或者过期的数据进行清理或同步。
[0094] 控制方法四
[0095] 为实现数据一致性,具体方法可以为:
[0096] 在进行冷启动或者水平扩容时,为缓存空间中的每个用户设置加载标志位,并删除建立的三级索引;
[0097] 在冷启动或者水平扩容后,存储模块接收到用户的存储操作或者读取操作请求时,将设置有加载标志位的用户的私信内容从数据库中加载到当前缓存空间,根据当前缓存空间重建三级索引后,删除所设置的加载标志位。
[0098] 在一个实施例中,假设缓存空间中所有已存在用户为用户A、用户B、用户C和用户D。控制模块为每个用户设置加载标志位分别为Reload_A,Reload_B,Reload_C,Reload_D,在设置成功后,控制模块会接收到确认(ACK)信息。控制模块还会删除已建立的三级索引结构,以及缓存空间中根据已建立的三级索引结构进行存储的私信。在进行水平扩容后,假设缓存空间中的物理存储节点由10个扩到20个,这时,存储模块接收到用户的存储操作或者读取操作请求时,会根据用户是否设置有加载标志位,将有加载标志位的用户的私信内容从数据库中加载到当前缓存空间,并根据扩容后的20个物理存储节点,重建三级索引。控制模块将已设置的Reload_A,Reload_B,Reload_C,Reload_D删除。
[0099] 该方法中,存储模块根据加载标志位从数据库中加载私信,如果用户不置有加载标志位,就说明不需要从数据库中加载私信。标志位加载服务可以分批次指定用户,加载速度可以自由控制,避免了高峰期重置的时候造成数据库的压力。
[0100] 控制方法五
[0101] 数据容错服务是一个独立的进程,通过不断的从数据库中拉取数据,并与当前缓存储存系统中的数据比对,发现不一致的数据,并进行同步处理,该进程会根据当前的访问压力,自动决定同步频率。
[0102] 具体方法为:定时将数据库中的私信内容与缓存空间中的私信内容进行比较,按照数据库中的私信内容同步缓存空间中的私信内容。
[0103] 基于同样的发明构思,本发明公开了一种私信存储系统,结构示意图如图4所示。该系统包括存储模块401和缓存模块402,所述存储模块401包括索引创建单元4011和存储单元4012;
[0104] 所述索引创建单元4011,为私信创建三级索引结构,所述三级索引结构包括:一级索引、二级索引和三级索引;
[0105] 所述存储单元4012,根据所述三级索引结构对私信进行存储,将私信存储到缓存模块402中;
[0106] 其中,所述一级索引为通过对用户标识进行映射得到第一键值;通过对用户标识进行一致性哈希算法得到第一键值的索引地址;
[0107] 所述二级索引为通过对用户标识和会话标识进行映射得到第二键值;通过对用户标识进行一致性哈希算法得到第二键值的索引地址;
[0108] 所述三级索引为通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址。
[0109] 存储单元4012具体用于,
[0110] 通过对发送者用户标识进行映射得到发送者用户标识对应的第一键值;通过对发送者用户标识进行一致性哈希算法得到发送者用户标识对应的第一键值的索引地址;将会话标识写入发送者用户标识对应的第一键值索引地址中;
[0111] 通过对发送者用户标识和会话标识进行映射得到发送者会话标识对应的第二键值;通过对发送者用户标识进行一致性哈希算法得到发送者会话标识对应的第二键值的索引地址;将私信主键写入发送者会话标识对应的第二键值索引地址中;
[0112] 通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址;将私信内容写入第三键值索引地址中;
[0113] 同时,通过对接收者用户标识进行映射得到接收者用户标识对应的第一键值;通过对接收者用户标识进行一致性哈希算法得到接收者用户标识对应的第一键值的索引地址;将会话标识写入接收者用户标识对应的第一键值索引地址中;
[0114] 通过对接收者用户标识和会话标识进行映射得到接收者会话标识对应的第二键值;通过对接收者用户标识进行一致性哈希算法得到接收者会话标识对应的第二键值的索引地址;将私信主键写入接收者会话标识对应的第二键值索引地址中;
[0115] 通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址;将私信内容写入第三键值索引地址中。
[0116] 所述存储模块401进一步包括读取单元4013,对存储的私信进行读取,具体用于:
[0117] 通过对发送者/接收者用户标识进行映射得到发送者/接收者用户标识对应的第一键值;通过对发送者/接收者用户标识进行一致性哈希算法得到发送者/接收者用户标识对应的第一键值的索引地址;将会话标识从发送者/接收者用户标识对应的第一键值索引地址中读取出来;
[0118] 通过对发送者/接收者用户标识和会话标识进行映射得到发送者/接收者会话标识对应的第二键值;通过对发送者/接收者用户标识进行一致性哈希算法得到发送者/接收者会话标识对应的第二键值的索引地址;将私信主键从发送者/接收者会话标识对应的第二键值索引地址中读取出来;
[0119] 通过对私信主键进行映射得到第三键值;通过对会话标识进行一致性哈希算法得到第三键值的索引地址;将私信内容从第三键值索引地址中读取出来。
[0120] 缓存模块402中包括多个物理存储节点组,每个键值索引地址对应有一组物理存储节点,该组物理存储节点包括通过链表依次链接的一个主节点和其余多个从节点;
[0121] 在进行存储操作时,存储单元4012还用于:从主节点开始,依次在该键值索引地址所对应的每个物理存储节点上进行写操作;
[0122] 或者,在进行读取操作时,读取单元4013还用于:对根据权重从该键值索引地址所对应的所有物理存储节点中选择出的一个物理存储节点进行读操作。
[0123] 进一步地,为保证数据一致性和系统的高可用性,该系统还包括控制模块403,所述控制模块中包括主从调度单元4031,用于当主节点故障时,将链表中距离主节点最近的从节点作为新的主节点;当从节点故障时,修改链表中位于故障从节点前一个节点的链表指针,将所述链表指针指向故障从节点的后一个节点。
[0124] 所述控制模块403还包括缓存空间动态规划单元4032,
[0125] 定期扫描存储的第三键值,查找到超过预定时间的第三键值;
[0126] 在超过预定时间的第三键值所对应的私信内容中设置私信内容删除标志位,用于在缓存空间达到阈值时,将设置有删除标志位的私信内容删除。
[0127] 所述私信内容中包括私信过期时间,所述控制模块403还包括数据清洗单元4033,[0128] 定时查找预定时间段内的第三键值,获取所对应的私信内容中的过期时间;将超过过期时间的私信内容删除;
[0129] 或者,定期查找预定时间段内的私信主键,通过对私信主键进行映射得到第三键值,获取所对应的私信内容中的过期时间;将超过过期时间的私信内容删除;
[0130] 或者,通过随机函数随机生成私信主键,通过对私信主键进行映射得到第三键值,获取所对应的私信内容中的过期时间;将超过过期时间的私信内容删除;
[0131] 或者,根据用户输入的读取请求,将读取到的超过过期时间的私信内容删除。
[0132] 所述控制模块403还包括标志位加载单元4034,
[0133] 在进行冷启动或者水平扩容时,为缓存空间中的每个用户设置加载标志位,并删除建立的三级索引;
[0134] 在冷启动或者水平扩容后,存储模块接收到用户的存储操作或者读取操作请求时,从数据库中将设置有加载标志位的用户的私信内容加载到当前缓存空间,根据当前缓存空间重建三级索引后,删除所设置的加载标志位。
[0135] 所述控制模块403还包括数据容错单元4035,用于定时将数据库中的私信内容与缓存空间中的私信内容进行比较,按照数据库中的私信内容同步缓存空间中的私信内容。
[0136] 需要说明的是,本发明的存储模块中实际上还包括负载均衡单元,用于获取系统中物理存储节点的拓扑结构,以使存储单元或者读取单元根据多拓扑结构进行读写操作;还用于在进行存储操作时,获取主节点,以使存储单元从主节点开始,依次在物理存储节点组对应的每个物理存储节点上,进行写操作;还用于在进行读取操作时,根据预先设置好的权重从物理存储节点组中选择其中一个物理存储节点,以使读取单元进行读操作。但为清楚明了地呈现本发明,在图4中并未对负载均衡单元进行显示。
[0137] 本发明的有益效果在于:
[0138] 一、解放了关系型数据库的读写压力,正常情况下,本系统可以取代数据库独立负责私信读写服务。
[0139] 二、三级索引建立完成后立即返回成功,写库操作另起一个线程异步执行,大大提高了数据的读写速度,提升了用户体验。
[0140] 三、控制模块提供了一系列服务保证数据一致性和系统的高可用性。
[0141] 四、物理存储节点组采用链式结构还可以缓解冷启动时各节点网卡的压力,同时保证了系统的高可用性。
[0142] 五、采用一致性哈希算法计算私信存储位置,而不是采用其他哈希算法,在同一物理存储节点组中,增加或者删除节点并不会导致整个哈希键重新分布。
[0143] 以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。