一种支持字符串操作的实时协同编辑一致性维护方法
技术领域
本发明属于计算机支持的协同工作领域,涉及一种实时文本协同编辑方法,具体涉及一种支持字符串操作的实时协同编辑一致性维护方法。
背景技术
实时协同编辑是计算机支持的协同工作中的一个重要应用领域。实时协同编辑系统有别于传统的分布式系统,允许不同地理位置的用户同时编辑同一份文档,每个站点都存储共享文档的副本。由于多用户可同时编辑共享文档的副本,因而给共享文档的一致性维护带来了挑战。
可交换的复制数据类型(Commutative Replicated Data Type,CRDT)方法是近几年新兴的一致性维护方法。主要思想,通过分配给操作对象唯一全局的ID,使得并发操作可以交换执行。基于操作对象的ID将其全序的映射到内部数据结构中,可维护操作意图的一致性,并收敛于一致性的结果。与传统的一致性维护的方法相比,CRDT方法的计算效率更高,具有很好的操作响应性。然而,大部分CRDT方法都不支持字符串的操作。
发明内容
为了解决上述技术问题,本发明提供了一种支持字符串的CRDT方法,尤其适合大规模的支持字符串操作的实时协同编辑一致性维护方法。
本发明所采用的技术方案是:一种支持字符串操作的实时协同编辑一致性维护方法,其特征在于:所述方法中的每个站点都维护两层数据结构:视图层View和模型层Model;所述模型层Model包括哈希表HT和双链表Lmodel;所述哈希表HT哈希存储所有结点Node,其中,每个结点Node存储操作的字符串;所述双链表Lmodel全序链接所述哈希表HT中的结点Node;所述视图层View提供了用户交互的界面,包括一个双链表Lview,是由所述双链表Lmodel中所有可见的结点Node链接而成;所述方法的控制流程分为本地操作处理和远程操作处理;本地操作产生后,遍历所述双链表Lmodel,找到目标结点后执行本地操作,并生成操作的传播形式Oremote后向各个站点传播;当接收到远程操作时,首先在所述哈希表HT中获取有效目标结点,然后在所述双链表Lmodel中获取有效的操作位置,执行远程操作;所述视图层View和所述模型层Model之间的同步过程为所述双链表Lview链接所述双链表Lmodel中所有可见结点。
作为优选,本地操作具体实现包括以下子步骤:
步骤1.1:用户产生本地元操作O;
步骤1.2:判断元操作O是否为插入操作;
若是,则执行下述步骤1.3;
若否,则执行下述步骤1.15;
步骤1.3:判断结点Node是否为双链表Lmodel中的头结点;
若是,则执行下述步骤1.4;
若否,则执行下述步骤1.7;
步骤1.4:创建新结点New_Node;
步骤1.5:将新结点New_Node链接到Lmodel中的头结点后;
步骤1.6:将新结点New_Node添加到所述哈希表HT中,本流程结束;
步骤1.7:判断是否在结点Node内部插入;
若是,则执行下述步骤1.8;
若否,则执行下述步骤1.12;
步骤1.8:创建新结点New_Node;
步骤1.9:将结点Node分裂为两个子结点,分别记作FNode和LNode;
步骤1.10:将新结点New_Node链接到FNode和LNode之间;
步骤1.11:将新结点New_Node、FNode和LNode添加到所述哈希表HT中,本流程结束;
步骤1.12:创建新结点New_Node;
步骤1.13:将新结点New_Node链接到双链表Lmodel中的Node后;
步骤1.14:将新结点New_Node添加到所述哈希表HT中,本流程结束;
步骤1.15:判断删除字符串是否跨越多个结点;
若是,则执行下述步骤1.16;
若否,则执行下述步骤1.19;
步骤1.16:删除第一个结点Node;
步骤1.17:删除中间n-1个结点Node;
步骤1.18:删除最后一个结点Node,本流程结束;
步骤1.19:判断是否删除整个结点;
若是,则执行下述步骤1.20;
若否,则执行下述步骤1.21;
步骤1.20:将结点Node置为墓碑,本流程结束;
步骤1.21:判断是否删除结点前部分;
若是,则执行下述步骤1.22;
若否,则执行下述步骤1.24;
步骤1.22:将结点Node分裂为子结点FNode和LNode;
步骤1.23:将FNode置为墓碑,本流程结束;
步骤1.24:判断是否删除结点后部分;
若是,则执行下述步骤1.25;
若否,则执行下述步骤1.27;
步骤1.25:将结点Node分裂为子结点FNode和LNode;
步骤1.26:将LNode置为墓碑,本流程结束;
步骤1.27:将结点Node分裂为三个子结点,记作FNode、MNode和LNode;
步骤1.28:将MNode置为墓碑,本流程结束。
作为优选,远程操作具体实现包括以下子步骤:
步骤2.1:针对接收到的远程操作O,判断O是否为插入操作;
若是,则执行下述步骤2.2;
若否,则执行下述步骤2.21;
步骤2.2:寻找目标结点Node;
步骤2.3:判断目标结点Node是否为双链表Lmodel中的头结点;
若是,则执行下述步骤2.4;
若否,则执行下述步骤2.12;
步骤2.4:判断目标结点Node后是否有其它并发插入的结点;
若是,则执行下述步骤2.5;
若否,则执行下述步骤2.9;
步骤2.5:创建新结点New_Node;
步骤2.6:比较新结点New_Node与其它并发插入结点的标识符Key,找插入位置;
步骤2.7:找并发插入结点的标识符Key小于New_Node的标识符Key的第一个结点,记作Tar_Node,新结点New_Node插入到Tar_Node前;
步骤2.8:将新结点New_Node添加到所述哈希表HT中,本流程结束;
步骤2.9:创建新结点New_Node;
步骤2.10:将新结点New_Node链接到所述双链表Lmodel中的Node后;
步骤2.11:将新结点New_Node添加到所述哈希表HT中,本流程结束;
步骤2.12:判断是否在结点Node内部插入;
若是,则执行下述步骤2.13;
若否,则执行下述步骤2.17;
步骤2.13:创建新结点New_Node;
步骤2.14:将结点Node分裂为两个子结点FNode和LNode;
步骤2.15:将新结点New_Node链接到FNode和LNode之间;
步骤2.16:将新结点New_Node、FNode和LNode添加到所述哈希表HT中,本流程结束;
步骤2.17:创建新结点New_Node;
步骤2.18:比较新结点New_Node与Node后其他并发插入结点的标识符Key,找插入位置;
步骤2.19:找并发插入结点中的标识符Key小于New_Node的标识符Key的第一个结点,记作Tar_Node,新结点New_Node插入到Tar_Node前;
步骤2.20:将新结点New_Node添加到所述哈希表HT中,本流程结束;
步骤2.21:判断删除字符串是否跨越多个结点;
若是,则执行下述步骤2.22;
若否,则执行下述步骤2.25;
步骤2.22:删除第一个结点Node;
步骤2.23:删除中间n-1个结点Node;
步骤2.24:删除最后一个结点Node,本流程结束;
步骤2.25:判断是否删除整个结点;
若是,则执行下述步骤2.26;
若否,则执行下述步骤2.27;
步骤2.26:将结点Node置为墓碑,本流程结束;
步骤2.27:判断是否删除结点前部分;
若是,则执行下述步骤2.28;
若否,则执行下述步骤2.30;
步骤2.28:将结点Node分裂为FNode和LNode;
步骤2.29:将FNode置为墓碑,本流程结束;
步骤2.30:判断是否删除结点后部分;
若是,则执行下述步骤2.31;
若否,则执行下述步骤2.33;
步骤2.31:将结点Node分裂为FNode和LNode;
步骤2.32:将LNode置为墓碑,本流程结束;
步骤2.33:将结点Node分裂为三个子结点,记作FNode、MNode和LNode;
步骤2.34:将MNode置为墓碑,本流程结束。
作为优选,如果要维持结点Node之间的全序关系不仅需要给每个结点Node分配唯一的ID,而且还需要维护一个哈希表HT。
作为优选,当ID中若干判定条件相等情况下,则能用站点号来定序,基于哈希表HT和唯一的ID,通过哈希映射,能在O(1)时间内找到双链表Lmodel中目标结点Node。
作为优选,双链表Lmodel中的Node可能由于并发并发操作导致Node分裂,因此需要找Node分裂的子结点,故需要给子结点分配唯一的ID;找到子结点后,能执行相应的插入或删除操作。
本方法不仅可维护操作意图的一致性还能实现结果一致性。该方法比目前典型的CRDT方法的效率都高,可提供很好的操作响应性,并适合大规模的协同编辑环境。
附图说明
图1:本发明实施例的整体框架图;
图2:本发明实施例的本地操作流程图;
图3:本发明实施例的远程操作流程图;
图4:本发明实施例的协同工作场景示意图;
图5:本发明实施例的三个站点的协同工作场景示意图。
具体实施方式
为了便于本领域普通技术人员理解和实施本发明,下面结合附图及实施例对本发明作进一步的详细描述,应当理解,此处所描述的实施示例仅用于说明和解释本发明,并不用于限定本发明。
请见图1,本发明提供的一种支持字符串操作的一致性维护方法的每个站点都维护两层数据结构:视图层(View)和模型层(Model)。Model包括哈希表(HT,Hash Table)和双链表(Lmodel)。HT哈希存储所有结点Node。其中,每个Node存储操作的字符串。Lmodel全序链接HT中的Node。View提供了用户交互的界面,包括一个双链表Lview,是由Lmodel中所有可见的Node链接而成。
控制流程分为本地操作处理和远程操作处理。本地操作产生后,遍历Lmodel,找到目标结点后执行本地操作,并生成操作的传播形式Oremote后向各个站点传播。当接收到远程操作时,首先在HT中获取有效目标结点,然后在Lmodel中获取有效的操作位置,执行远程操作。View和Model之间的同步过程为Lview链接Lmodel中所有可见结点(不包括Lmodel中的墓碑结点)。
以下通过具体实施例对本发明做进一步的阐述;
请见图2,本实施例的本地操作处理分为本地插入操作和本地删除操作,执行步骤如下:
(1)本地插入操作
基于插入操作的目标结点Node在Lmodel中位置,分两种情况:第一,如果在头结点插入,直接将新结点New_Node链接到Lmodel中,并将New_Node添加到HT中;第二,如果不在头结点插入,在Lmodel中找到目标结点后,具体分两种情况:①如果在目标结点内插入,目标结点被分裂成前后两个子结点FNode和LNode,需要将FNode、新结点New_Node、LNode链接到Lmodel中,并将这三个结点添加到HT中;②如果在目标结点后插入,需要将新结点New_Node链接到Lmodel中,并且将New_Node添加到HT中。
(2)本地删除操作
本地删除操作需要考虑五种情况。第一,删除整个结点,直接将其置为墓碑。第二,删除结点前部分,导致原始结点分裂成前后两个结点,将前结点置为墓碑,并将前后结点链接到Lmodel中。第三,删除结点后部分,导致原始结点分裂成前后两个结点,将后结点置为墓碑,并将前后结点链接到Lmodel中。第四,删除结点的中间部分,导致原始结点分裂成前、中、后三个结点,将中间结点置为墓碑,并将这三个结点链接到Lmodel中。第五,删除的字符序列跨越多个结点。
请见图3,本实施例的远程操作处理分为远程插入操作和远程删除操作,执行步骤如下:
(1)远程插入操作
根据接收的远程插入操作的原结点的key,在HT中找有效的目标结点。找到目标结点后,插入新结点New_Node分如下两种情况。(1)目标结点不是头结点,分①②两种情况。①在目标结点后插入,需要与目标结点后的多个并发插入结点比较各自的key,直到某个并发插入结点的key<新结点New_Node的key,将New_Node双向链接到该并发结点前,并将New_Node插入到HT中;②在目标结点内插入,导致目标结点被分裂成前后两个结点FNode和LNode,将新结点New_Node双向链接到FNode和LNode之间,并将New_Node、FNode和LNode插入到HT中。(2)目标结点是头结点,分为①②两种情况。①目标结点后有多个结点,需要逐个遍历目标结点后的结点,直到某个结点的key<新结点New_Node的key,将New_Node双向链接到该结点前,并将New_Node插入到HT中;②目标结点后无结点,直接将New_Node双向链接到目标结点后,将新结点New_Node插入到HT中。
(2)远程删除操作
远程删除操作需要考虑两种情况。第一,若删除的字符串位于一个结点内,直接将删除的字符串设置为墓碑。第二,若删除的字符串跨越多个结点,需要先删除第一结点,再删除中间的n-1个结点,最后删除第n个结点,分别将相应的结点设置为墓碑。
首先进行相关定义:
定义1Node<key,flag,visible,content,prior,next,link,list>是一个八元组。key为Node的唯一标识;flag表示Node是否分裂;visible表示Node是否可见;content表示存储的字符串;prior、next和link用于链接Node;list存储分裂的Node。
定义2ID<s,ssv,site,offset,len>为一个五元组,s为session的标识符,一个全局递增整数;ssv为状态向量sv[k]的求和,site为站点号;offset为偏移量,即当前Node的最左面字符与原始Node(未被分裂的结点)的最左面字符的距离,初值为0;len为Node的长度,即对应字符串的长度。
定义3给定Node1和Node2的ID为和如果当且仅当满足下列条件之一:(1)(2)如果有且或(3)如果有或(4)如果有
基于定义1到定义3,在图4的协同工作场景中,有site1,site2和site3共同参与,且session的计数为1。各操作O1,O2,O3,O4对应的字序列长度分别3,4,6,5,各站点产生的操作及对应的sv如图4所示。操作结点的ID分别为: 基于定义2和定义3,有
图5为一个session中三个站点的协同工作场景。假设session的计数为1,初始状态为空,站点号大小为site1<site2<site3,其中为在第i个站点的第j个状态,表示为墓碑字符。为更好描述字符序列对应的结点的前后位置和结点分裂情况,本文用“-”连接字符序列对应的结点。site1产生本地操作O1=insert(0,0,“aaa”),O4=insert(1,2,“ddd”);site2产生本地操作O2=insert(0,0,“bbb”),O5=insert(1,1,“eee”);site3产生本地操作O3=insert(0,0,“ccc”),O6=delete(1,1,2)。各个操作的SV分别为SV(O1)=(1,0,0),SV(O2)=(0,1,0),SV(O3)=(0,0,1),SV(O4)=(2,1,0),SV(O5)=(0,2,0),SV(O6)=(0,0,2)。各个操作对象分配的ID为 按照ID的全序机制,有
表1给出该方法的执行过程。利用本发明提出的支持字符串操作的协同编辑方法,三个站点都收敛于“cc-c-b-eee-b-ddd-b-aaa”,即“cbeeebdddbaaa”。综上所述,支持字符串的文本编辑实时协同方法,能够实现多个站点维护协同结果的一致性。
表1各站点操作的执行
本方法比目前典型的CRDT方法的效率都高,可提供很好的操作响应性,并适合大规模的协同编辑环境。
应当理解的是,本说明书未详细阐述的部分均属于现有技术。
应当理解的是,上述针对较佳实施例的描述较为详细,并不能因此而认为是对本发明专利保护范围的限制,本领域的普通技术人员在本发明的启示下,在不脱离本发明权利要求所保护的范围情况下,还可以做出替换或变形,均落入本发明的保护范围之内,本发明的请求保护范围应以所附权利要求为准。