CN113420011A - redis事务回滚方法、装置、计算机设备和存储介质 - Google Patents
redis事务回滚方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN113420011A CN113420011A CN202110726574.7A CN202110726574A CN113420011A CN 113420011 A CN113420011 A CN 113420011A CN 202110726574 A CN202110726574 A CN 202110726574A CN 113420011 A CN113420011 A CN 113420011A
- Authority
- CN
- China
- Prior art keywords
- command
- redis
- commands
- abnormal
- transaction
- 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 52
- 230000002159 abnormal effect Effects 0.000 claims abstract description 94
- 238000004590 computer program Methods 0.000 claims description 12
- 230000007246 mechanism Effects 0.000 claims description 7
- 238000001514 detection method Methods 0.000 claims description 5
- 238000005096 rolling process Methods 0.000 abstract description 10
- 238000012545 processing Methods 0.000 abstract description 3
- 230000008569 process Effects 0.000 description 13
- 238000011161 development Methods 0.000 description 4
- 238000010586 diagram Methods 0.000 description 4
- 230000004048 modification Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000008859 change Effects 0.000 description 2
- 230000001360 synchronised effect Effects 0.000 description 2
- 238000012795 verification Methods 0.000 description 2
- 108010001267 Protein Subunits Proteins 0.000 description 1
- 230000005856 abnormality Effects 0.000 description 1
- 230000003139 buffering effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 230000003068 static 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/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/21—Design, administration or maintenance of databases
- G06F16/217—Database tuning
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2282—Tablespace storage structures; Management thereof
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2365—Ensuring data consistency and integrity
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Retry When Errors Occur (AREA)
Abstract
本申请涉及数据处理技术领域,提供了一种redis事务回滚方法、装置、计算机设备和存储介质,获取redis事务中的若干命令;所述命令包括get命令和非get命令;获取各个所述非get命令对应的key的原始结果;将所述原始结果按照预设规则存储在redis数据库中;将若干命令按照加入redis事务中的顺序依次执行,并实时检测命令的执行是否异常;若检测到当前执行的命令异常,根据原始结果对异常的命令和已经执行完成的命令进行事务回滚操作。本申请提供的redis事务回滚方法、装置、计算机设备和存储介质,通过将非get命令对应的key的原始结果存储在redis数据库中,在遇到执行异常的命令时,将已经执行的所有命令的对应的原始结果恢复,需手动校验数据,由程序内部逻辑保证数据准确性。
Description
技术领域
本申请涉及数据处理的技术领域,特别涉及一种redis事务回滚方法、装置、计算机设备和存储介质。
背景技术
redis是一种非关系型数据库,它自带的事务功能是指:提供多个命令打包,然后根据先进先出原则执行命令,在执行的过程中,直到所有命令执行完,事务才算结束,并不关注过程中某个命令的成功或失败。因此如果遇到中间某一命令A执行出现异常,命令A之后的命令可能都无法正确执行,而A之前的命令已经被执行,这可能不是开发者所希望的。目前大多数开发者对于redis事务回滚的操作,需要每次在开发过程中记录需要记录的命令,然后做幂等校验保证redis事务的一致性,这种操作容易遗漏,导致出现问题。
发明内容
本申请的主要目的为提供一种redis事务回滚方法、装置、计算机设备和存储介质,旨在解决redis事务回滚时无法准确保证redis事务的一致性的技术问题。
为实现上述目的,本申请提供了一种redis事务回滚方法,包括以下步骤:
获取redis事务中的若干命令;所述命令包括get命令和非get命令;
获取各个所述非get命令对应的key的原始结果;
将所述原始结果按照预设规则存储在redis数据库中;
将若干所述命令按照加入所述redis事务中的顺序依次执行,并实时检测所述命令的执行是否异常;
若检测到当前执行的所述命令异常,根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作。
进一步地,所述获取各个所述非get命令对应的key的原始结果的步骤,包括:
获取各个所述非get命令对应的key;
构建所述key对应的目的get命令,并根据所述目的get命令获取所述key对应的原始结果。
进一步地,所述将所述原始结果按照预设规则存储在redis数据库中的步骤,包括:
将所述原始结果以string类型存储在所述redis数据库中预设的undolog buffer中。
进一步地,所述获取redis事务中的若干命令的步骤之前,包括:
检测各个所述命令的命令格式是否正确;
若正确,进入获取需要redis执行的若干命令的步骤。
进一步地,所述根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作的步骤,包括:
检测异常的所述命令之前是否存在其他非get命令;
若存在,获取异常的所述非get命令和异常的所述非get命令之前的其他非get命令的个数之和;
将所述个数之和与预设个数进行比较;
若所述个数之和大于所述预设个数,通过checkpoint机制对异常的所述非get命令和异常的非get命令之前的其他非get命令进行事务回滚操作。
进一步地,所述根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作的步骤之后,包括:
检测所述事务回滚操作是否完成;
若完成,删除所述redis数据库中存储的所述原始结果;
若未完成,重复预设次数的事务回滚操作。
进一步地,所述实时检测各个所述命令的执行是否异常的步骤,包括:
通过try catch命令实时检测所述命令的执行是否异常。
本申请还提供一种redis事务回滚装置,包括:
第一获取单元,用于获取redis事务中的若干命令;所述命令包括get命令和非get命令;
第二获取单元,用于获取各个所述非get命令对应的key的原始结果;
存储单元,用于将所述原始结果按照预设规则存储在redis数据库中;
第一检测单元,用于将若干所述命令按照加入所述redis事务中的顺序依次执行,并实时检测各个所述命令的执行是否异常;
回滚单元,用于若检测到当前执行的所述命令异常,根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作。
本申请还提供一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时实现上述任一项所述的redis事务回滚方法的步骤。
本申请还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一项所述的redis事务回滚方法的步骤。
本申请提供的redis事务回滚方法、装置、计算机设备和存储介质,获取redis事务中的若干命令;所述命令包括get命令和非get命令;获取各个所述非get命令对应的key的原始结果;将所述原始结果按照预设规则存储在redis数据库中;将若干所述命令按照加入所述redis事务中的顺序依次执行,并实时检测各个所述命令的执行是否异常;若检测到当前执行的所述命令异常,根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作。本申请提供的redis事务回滚方法、装置、计算机设备和存储介质,通过将非get命令对应的key的原始结果存储在redis数据库中,在遇到执行异常的命令时,将已经执行的所有命令的对应的原始结果恢复,这样不需要开发者在进行redis事务操作时,每次手动在开发过程中记录需要执行的非get命令,然后做幂等校验保证redis事务的一致性,通过本实施例提供的redis事务回滚方法,无需手动校验数据,由程序内部逻辑保证数据准确性。
附图说明
图1是本申请一实施例中redis事务回滚方法步骤示意图;
图2是本申请另一实施例中redis事务回滚装置结构框图;
图3为本申请一实施例的计算机设备的结构示意框图。
本申请目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
参照图1,本申请一实施例提供了一种redis事务回滚方法,包括以下步骤:
步骤S1,获取redis事务中的若干命令;所述命令包括get命令和非get命令;
步骤S2,获取各个所述非get命令对应的key的原始结果;
步骤S3,将所述结果按照预设规则存储在redis数据库中;
步骤S4,将若干所述命令按照加入所述redis事务中的顺序依次执行,并实时检测各个所述命令的执行是否异常;
步骤S5,若检测到当前执行的所述命令异常,根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作。
本实施例中,redis数据库是一个高性能的key-value数据库,redis事务的本质是一组命令的集合,redis事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会***到事务执行命令序列中,通常会使用MULTI,EXEC,WATCH等命令来进行。本实施例中所述的redis数据库是运行在单机环境下的。如上述步骤S1所述,一个redis事务中包括有多个命令,若干命令可分为get命令和非get命令两种,get命令即根据该命令查询或获取相应的key的任何原始结果,对该原始结果不会产生改变,非get命令则恰好相反,非get命令会做一些其他的操作,如计数、赋值等,当非get命令执行后,该非get命令相应的key所对应的原始结果会发生变化,生成目标结果。
如上述步骤S2-S3所述,每个命令均有其对应的key,即该命令的操作对象,如a=2,命令“incr a”即将a自增1,得到目标结果3,该命令所对应的key为a,key的原始结果即还未执行该命令前的结果即a的原始结果为2。获取非get命令对应的key的原始结果,并将原始结果存储到redis数据库中,便于后续根据需要进行回滚,同时将原始结果存储在redis数据库中,回滚时也能较快的从redis数据库中读取原始结果,能在较短时间内完成回滚。
如上述步骤S4所述,存储完成后,redis事务后的所有命令都不会被立即执行,而是被加入到队列中缓存起来,当收到Exec命令的时候redis事务中的各个命令会按入队顺序依次执行,即按照先进先出的原则依次执行命令。每执行一个命令就检测该命令的执行是否异常,能够及时的检测到异常,及时进行事务回滚操作,无需再执行后续的命令。在其他实施例中,可以在该redis事务中的所有命令执行完毕后,再依次检测各个命令的执行是否异常。由于get命令仅仅是用于查询或获取,一般在执行时,不会出现异常,因此,一般执行出现异常的是非get命令。
如上述步骤S5所述,当命令执行过程中存在异常时,从redis数据库中获取存储的原始结果,根据获取到的原始结果对异常的命令和该命令以前的已经执行完成的命令进行事务回滚操作,使得已执行的命令恢复到未执行的状态。
本实施例中,通过将非get命令对应的key的原始结果存储在redis数据库中,在遇到执行异常的命令时,将已经执行的所有命令的对应的原始结果恢复,这样不需要开发者在进行redis事务操作时,每次手动在开发过程中记录需要执行的非get命令,然后做幂等校验保证redis事务的一致性,通过本实施例提供的redis事务回滚方法,无需手动校验数据,由程序内部逻辑保证数据准确性。
在一实施例中,所述获取各个所述非get命令对应的key的原始结果的步骤S2,包括:
步骤S21,获取各个所述非get命令对应的key;
步骤S22,构建所述key对应的目的get命令,并根据所述目的get命令获取所述key对应的原始结果。
本实施例中,如上述步骤S21所述,获取非get命令的key,如对于非get命令“incra”即对a自增1,若a的原始结果为“hhh”,由于“hhh”为字符串型,1为整型数字,无法对a进行自增,但该命令依然能执行,只是执行后产生的目标结果仍为“hhh”,目标结果是不正确的,即可确定该命令发生了异常,因此在执行该命令前获取key:a,避免非get命令执行后,key对应的原始结果发生了变化。
如上述步骤S22所述,构建该key的目的get命令,如“get a”,即可得到a的原始结果“hhh”,将原始结果按照先入先出的原则存储在redis数据库中,即按照其对应的非get命令在队列的顺序进行排列,便于后续在事务回滚时从redis数据库中取出对应的原始结果。
本实施例中,所述将所述原始结果按照预设规则存储在redis数据库中的步骤S3,包括:
步骤S31,将所述原始结果以string类型存储在所述redis数据库中预设的undolog buffer中。
本实施例中,string类型是一种引用类型,在栈上保持引用,在堆上保持数据,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象,因此,将原始结果以string类型进行存储,提高原始结果的安全性。string类型由final修饰,引用类型变量是引用的地址不可变,而不是引用的值不可变,因此,可根据引用的地址获取相应的原始结果进行事务回滚操作。redis数据库中划分有一块缓存区域undolog buffer用于存储获取到的原始结果,通过在redis数据库中引入undolog buffer,将非get命令的操作前的原始结果缓存起来,在遇到执行异常的命令时,将原始结果恢复,保证redis事务中的命令执行失败前后保持一致。
本一实施例中,所述获取redis事务中的若干命令的步骤S1之前,包括:
步骤S1A,检测各个所述命令的命令格式是否正确;
步骤S1B,若正确,进入获取需要redis执行的若干命令的步骤。
本实施例中,检测各个命令的命令格式是否正确,即检测各个命令是否出现语法错误,如参数的数量错误、命令名称错误等,具体的,可以使用redis客户端检测命令格式是否正确,在调用EXEC命令之前,客户端可以检查被放入队列的命令的返回值:如果命令的返回值是QUEUE字符串,那么就表示已经正确地将这个命令放入队列;否则,redis将返回一个错误,表明命令格式不正确。如果命令格式出现错误,可以把错误的命令打印出来,便于用户对错误的命令格式进行查看,通过检测命令格式的正确与否,保证命令能够成功的加入到redis事务的队列中。
在一实施例中,所述根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作的步骤S5,包括:
步骤S51,检测异常的所述命令之前是否存在其他非get命令;
步骤S52,若存在,获取异常的所述非get命令和异常的所述非get命令之前的其他非get命令的个数之和;
步骤S53,将所述个数之和与预设个数进行比较;
步骤S53,若所述个数之和大于所述预设个数,通过checkpoint机制对异常的所述非get命令和异常的非get命令之前的其他非get命令进行事务回滚操作。
本实施例中,对于队列中命令较多的情况下,若队列中顺序靠后的非get命令出现异常,那么需要进行回滚操作的非get命令就较多,处理量较大。检测异常的非get命令的前面是否已经执行过其他的非get命令,即除了该异常的非get命令之外的其他已执行的所有命令中是否有非get命令,若无,表明仅仅需要对该异常的非get命令进行事务回滚,从redis数据库的缓存区域undolog buffer获取该非get命令对应的原始数据进行事务回滚操作即可。若异常的非get命令前面有其他非get命令,获取异常的非get命令和之前的其他非get命令的个数之和,这个个数之和代表需要进行事务回滚操作的个数。预设个数由用户根据自身需要自行设置的,一般设置得较大,当个数之和大于预设个数,表明需要回滚操作的次数较多,借助checkpoint机制来加快回滚。checkpoint机制在命令开始前手动定义一个路径,然后把重要的数据如原始结果落地到该路径下,且本实施例中redis数据库运行在单机环境,将原始数据放在本机路径下就好了,这样能够很好的防止存储的原始数据丢失,事务回滚时,能够直接、快速地从本地路径下获取原始数据,加快事务回滚。
在一实施例中,所述根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作的步骤S5之后,包括:
步骤S5A,检测所述事务回滚操作是否完成;
步骤S5B,若完成,删除所述redis数据库中存储的所述原始结果;
步骤S5C,若未完成,重复预设次数的事务回滚操作。
本实施例中,检测事务回滚操作是否完成,完成时,表明各命令已经回到命令执行前的状态,后续可重新开始执行命令,删除redis数据库中存储的原始结果,便于其余redis事务的队列中的命令执行时使用。进一步地,检测到命令执行时存在异常时,将该异常的命令按照预设规则展示出来,供用户查看,同时接收用户对该命令的修改,修改完成后再重新执行这些命令。由于这次执行的还是这些命令,只是异常的命令经过了修改,可先不删除存储在redis数据库中的原始结果,当整个队列里的命令执行完毕后再删除。未完成事务回滚操作时,多次进行,提高事务回滚的成功率。当重复预设次数的事务回滚操作操作仍未完成时,生成告警信息用于提醒用户。
在一实施例中,所述实时检测所述命令的执行是否异常的步骤S3,包括:
步骤S31,通过try catch命令实时检测所述命令的执行是否异常。
本实施例中,try catch命令中包括try语句和catch语句,try语句检测命令是否异常,如果发生异常,就会在依次在各个catch语句中试图匹配异常类型。catch语句的作用是输出异常信息。当你没有try catch命令的时候,如果出现错误,则程序会报错,加上trycatch命令,出现异常错误时,仍正常运行,只是会将错误信息存储到Exception里,所以catch是用来提取错误信息的,可以在catch部分加上一句System.out.println(e.ToString())命令,如果出现异常,可以生成异常列表把异常打印出来,直接在异常列表中即可确定命令是否出现异常。
在其他实施例中,redis事务中命令存在异常,多由于操作数据结构引起的错误,如将字符串型的数据与整型数字的数据进行操作,因此,检测命令是否异常时,可检测命令中的操作数据结构是否相同,从而确定命令是否存在异常。当检测到命令格式不正确,将不正确的命令生成错误报表供用户查看。
参见图2,本申请一实施例提供了一种redis事务回滚装置,包括:
第一获取单元10,用于获取redis事务中的若干命令;所述命令包括get命令和非get命令;
第二获取单元20,用于获取各个所述非get命令对应的key的原始结果;
存储单元30,用于将所述原始结果按照预设规则存储在redis数据库中;
第一检测单元40,用于将若干所述命令按照加入所述redis事务中的顺序依次执行,并实时检测各个所述命令的执行是否异常;
回滚单元50,用于若检测到当前执行的所述命令异常,根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作。
在一实施例中,所述第二获取单元20,包括:
第一获取子单元,用于获取各个所述非get命令对应的key;
构建子单元,用于构建所述key对应的目的get命令,并根据所述目的get命令获取所述key对应的原始结果。
在一实施例中,所述存储单元30,包括:
存储子单元,用于将所述原始结果以string类型存储在所述redis数据库中预设的undolog buffer中。
在一实施例中,所述redis事务回滚装置,还包括:
第二检测单元,用于检测各个所述命令的命令格式是否正确;
进入单元,用于若正确,进入获取需要redis执行的若干命令的步骤。
在一实施例中,所述回滚单元50,包括:
第一检测子单元,用于检测异常的所述命令之前是否存在其他非get命令;
第二获取子单元,用于若存在,获取异常的所述非get命令和异常的所述非get命令之前的其他非get命令的个数之和;
比较子单元,用于将所述个数之和与预设个数进行比较;
回滚子单元,用于若所述个数之和大于所述预设个数,通过checkpoint机制对异常的所述非get命令和异常的非get命令之前的其他非get命令进行事务回滚操作。
在一实施例中,所述redis事务回滚装置,还包括:
第三检测单元,用于检测所述事务回滚操作是否完成;
删除单元,用于若完成,删除所述redis数据库中存储的所述原始结果;
重复单元,用于若未完成,重复预设次数的事务回滚操作。
在一实施例中,所述第一检测单元40,包括:
第二检测子单元,用于通过try catch命令实时检测所述命令的执行是否异常。
在本实施例中,上述各个单元、子单元的具体实现请参照上述方法实施例中所述,在此不再进行赘述。
参照图3,本申请实施例中还提供一种计算机设备,该计算机设备可以是服务器,其内部结构可以如图3所示。该计算机设备包括通过***总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设计的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作***、计算机程序和数据库。该内存储器为非易失性存储介质中的操作***和计算机程序的运行提供环境。该计算机设备的数据库用于存储数据等。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种redis事务回滚方法。
上述处理器执行上述redis事务回滚方法的步骤:
获取redis事务中的若干命令;所述命令包括get命令和非get命令;
获取各个所述非get命令对应的key的原始结果;
将所述原始结果按照预设规则存储在redis数据库中;
将若干所述命令按照加入所述redis事务中的顺序依次执行,并实时检测各个所述命令的执行是否异常;
若检测到当前执行的所述命令异常,根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作。
在一实施例中,上述处理器执行所述获取各个所述非get命令对应的key的原始结果的步骤,包括:
获取各个所述非get命令对应的key;
构建所述key对应的目的get命令,并根据所述目的get命令获取所述key对应的原始结果。
在一实施例中,上述处理器执行所述将所述原始结果按照预设规则存储在redis数据库中的步骤,包括:
将所述原始结果以string类型存储在所述redis数据库中预设的undolog buffer中。
在一实施例中,上述处理器执行所述获取redis事务中的若干命令的步骤之前,包括:
检测各个所述命令的命令格式是否正确;
若正确,进入获取需要redis执行的若干命令的步骤。
在一实施例中,上述处理器执行所述根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作的步骤,包括:
检测异常的所述命令之前是否存在其他非get命令;
若存在,获取异常的所述非get命令和异常的所述非get命令之前的其他非get命令的个数之和;
将所述个数之和与预设个数进行比较;
若所述个数之和大于所述预设个数,通过checkpoint机制对异常的所述非get命令和异常的非get命令之前的其他非get命令进行事务回滚操作。
在一实施例中,上述处理器执行所述根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作的步骤之后,包括:
检测所述事务回滚操作是否完成;
若完成,删除所述redis数据库中存储的所述原始结果;
若未完成,重复预设次数的事务回滚操作。
在一实施例中,上述处理器执行所述实时检测所述命令的执行是否异常的步骤,包括:
通过try catch命令实时检测所述命令的执行是否异常。
本领域技术人员可以理解,图3中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定。
本申请一实施例还提供一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现一种redis事务回滚方法。
综上所述,为本申请实施例中提供的redis事务回滚方法、装置、计算机设备和存储介质,获取redis事务中的若干命令;所述命令包括get命令和非get命令;获取各个所述非get命令对应的key的原始结果;将所述原始结果按照预设规则存储在redis数据库中;将若干所述命令按照加入所述redis事务中的顺序依次执行,并实时检测各个所述命令的执行是否异常;若检测到当前执行的所述命令异常,根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作若。本申请提供的redis事务回滚方法、装置、计算机设备和存储介质,通过将非get命令对应的key的原始结果存储在redis数据库中,在遇到执行异常的命令时,将已经执行的所有命令的对应的原始结果恢复,这样不需要开发者在进行redis事务操作时,每次手动在开发过程中记录需要执行的非get命令,然后做幂等校验保证redis事务的一致性,通过本实施例提供的redis事务回滚方法,无需手动校验数据,由程序内部逻辑保证数据准确性。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储与一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的和实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可以包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM通过多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双速据率SDRAM(SSRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其它变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、装置、物品或者方法不仅包括那些要素,而且还包括没有明确列出的其它要素,或者是还包括为这种过程、装置、物品或者方法所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、装置、物品或者方法中还存在另外的相同要素。
以上所述仅为本申请的优选实施例,并非因此限制本申请的专利范围,凡是利用本申请说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其它相关的技术领域,均同理包括在本申请的专利保护范围内。
Claims (10)
1.一种redis事务回滚方法,其特征在于,包括以下步骤:
获取redis事务中的若干命令;所述命令包括get命令和非get命令;
获取各个所述非get命令对应的key的原始结果;
将所述原始结果按照预设规则存储在redis数据库中;
将若干所述命令按照加入所述redis事务中的顺序依次执行,并实时检测所述命令的执行是否异常;
若检测到当前执行的所述命令异常,根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作。
2.根据权利要求1所述的redis事务回滚方法,其特征在于,所述获取各个所述非get命令对应的key的原始结果的步骤,包括:
获取各个所述非get命令对应的key;
构建所述key对应的目的get命令,并根据所述目的get命令获取所述key对应的原始结果。
3.根据权利要求1所述的redis事务回滚方法,其特征在于,所述将所述原始结果按照预设规则存储在redis数据库中的步骤,包括:
将所述原始结果以string类型存储在所述redis数据库中预设的undolog buffer中。
4.根据权利要求1所述的redis事务回滚方法,其特征在于,所述获取redis事务中的若干命令的步骤之前,包括:
检测各个所述命令的命令格式是否正确;
若正确,进入获取需要redis执行的若干命令的步骤。
5.根据权利要求1所述的redis事务回滚方法,其特征在于,所述根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作的步骤,包括:
检测异常的所述命令之前是否存在其他非get命令;
若存在,获取异常的所述非get命令和异常的所述非get命令之前的其他非get命令的个数之和;
将所述个数之和与预设个数进行比较;
若所述个数之和大于所述预设个数,通过checkpoint机制对异常的所述非get命令和异常的非get命令之前的其他非get命令进行事务回滚操作。
6.根据权利要求1所述的redis事务回滚方法,其特征在于,所述根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作的步骤之后,包括:
检测所述事务回滚操作是否完成;
若完成,删除所述redis数据库中存储的所述原始结果;
若未完成,重复预设次数的事务回滚操作。
7.根据权利要求1所述的redis事务回滚方法,其特征在于,所述实时检测所述命令的执行是否异常的步骤,包括:
通过try catch命令实时检测所述命令的执行是否异常。
8.一种redis事务回滚装置,其特征在于,包括:
第一获取单元,用于获取redis事务中的若干命令;所述命令包括get命令和非get命令;
第二获取单元,用于获取各个所述非get命令对应的key的原始结果;
存储单元,用于将所述原始结果按照预设规则存储在redis数据库中;
第一检测单元,用于将若干所述命令按照加入所述redis事务中的顺序依次执行,并实时检测所述命令的执行是否异常;
回滚单元,用于若检测到当前执行的所述命令异常,根据所述原始结果对异常的所述命令和已经执行完成的所述命令进行事务回滚操作。
9.一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述的redis事务回滚方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的redis事务回滚方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110726574.7A CN113420011A (zh) | 2021-06-29 | 2021-06-29 | redis事务回滚方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110726574.7A CN113420011A (zh) | 2021-06-29 | 2021-06-29 | redis事务回滚方法、装置、计算机设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113420011A true CN113420011A (zh) | 2021-09-21 |
Family
ID=77717191
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110726574.7A Pending CN113420011A (zh) | 2021-06-29 | 2021-06-29 | redis事务回滚方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113420011A (zh) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105718572A (zh) * | 2016-01-21 | 2016-06-29 | 成都索贝数码科技股份有限公司 | 一种异构数据复合对象的事务一致性达成方法与*** |
US20180032412A1 (en) * | 2016-07-26 | 2018-02-01 | Hewlett Packard Enterprise Development Lp | Resume host access based on transaction logs |
CN111209142A (zh) * | 2020-01-02 | 2020-05-29 | 中国平安财产保险股份有限公司 | 跨数据库的事务管理方法、装置、设备及存储介质 |
CN111753013A (zh) * | 2020-06-24 | 2020-10-09 | 中国银行股份有限公司 | 分布式事务处理方法及装置 |
CN112231144A (zh) * | 2020-09-29 | 2021-01-15 | 上海艾融软件股份有限公司 | 一种数据处理方法、装置及电子设备 |
CN112835688A (zh) * | 2021-02-01 | 2021-05-25 | 北京星网锐捷网络技术有限公司 | 分布式事务处理方法、设备及存储介质 |
CN112965984A (zh) * | 2021-05-18 | 2021-06-15 | 鲁班(北京)电子商务科技有限公司 | 一种执行数据库事务的方法及装置 |
-
2021
- 2021-06-29 CN CN202110726574.7A patent/CN113420011A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105718572A (zh) * | 2016-01-21 | 2016-06-29 | 成都索贝数码科技股份有限公司 | 一种异构数据复合对象的事务一致性达成方法与*** |
US20180032412A1 (en) * | 2016-07-26 | 2018-02-01 | Hewlett Packard Enterprise Development Lp | Resume host access based on transaction logs |
CN111209142A (zh) * | 2020-01-02 | 2020-05-29 | 中国平安财产保险股份有限公司 | 跨数据库的事务管理方法、装置、设备及存储介质 |
CN111753013A (zh) * | 2020-06-24 | 2020-10-09 | 中国银行股份有限公司 | 分布式事务处理方法及装置 |
CN112231144A (zh) * | 2020-09-29 | 2021-01-15 | 上海艾融软件股份有限公司 | 一种数据处理方法、装置及电子设备 |
CN112835688A (zh) * | 2021-02-01 | 2021-05-25 | 北京星网锐捷网络技术有限公司 | 分布式事务处理方法、设备及存储介质 |
CN112965984A (zh) * | 2021-05-18 | 2021-06-15 | 鲁班(北京)电子商务科技有限公司 | 一种执行数据库事务的方法及装置 |
Non-Patent Citations (3)
Title |
---|
MAXIAO1204: "理解数据库中的undo日志、redo日志、检查点 https://blog.csdn.net/Maxiao1204/article/details/107505537", 《CSDN》 * |
周宁: "《信息组织》", 30 September 2017, 武汉:武汉大学出版社 * |
王飞飞等: "《MySQL数据库应用从入门到精通 第2版》", 北京:中国铁道出版社 * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106462594B (zh) | 一种大规模并行处理数据库的***和方法 | |
US20150212927A1 (en) | Application Testing Automation | |
CN107329894B (zh) | 应用程序***测试方法、装置及电子设备 | |
CN108647357B (zh) | 数据查询的方法及装置 | |
Lowe | Testing for linearizability | |
CN112613993B (zh) | 交易数据处理方法、装置、计算机设备和存储介质 | |
US11080261B2 (en) | Hybrid concurrency control | |
WO2019074687A1 (en) | METHOD FOR COPYING PRODUCTION BEHAVIORS IN A DEVELOPMENT ENVIRONMENT | |
US8806270B2 (en) | Method, apparatus and product for testing transactions | |
CN110046086B (zh) | 用于测试的期望数据生成方法及装置和电子设备 | |
US10719388B2 (en) | Decoupled maintenance and repository synchronization error detection | |
CN111767213B (zh) | 数据库检查点的测试方法、装置、电子设备及存储介质 | |
US11182375B2 (en) | Metadata validation tool | |
CN115202898A (zh) | 消息消费方法、装置、计算机设备和存储介质 | |
CN113420011A (zh) | redis事务回滚方法、装置、计算机设备和存储介质 | |
CN112800194A (zh) | 一种接口变更识别方法、装置、设备及存储介质 | |
CN117454190A (zh) | 日志数据分析方法和装置 | |
CN112015766A (zh) | 一种基于流水的数据处理方法、装置及数据处理*** | |
US11783004B2 (en) | Identifying a script that originates synchronous and asynchronous actions | |
CN113986941A (zh) | 事务批量处理方法及装置 | |
CN115705297A (zh) | 代码调用检测方法、装置、计算机设备以及存储介质 | |
US9268598B2 (en) | Recording and profiling transaction failure source addresses and states of validity indicator corresponding to addresses of aborted transaction in hardware transactional memories | |
US8321844B2 (en) | Providing registration of a communication | |
CN117312833B (zh) | 一种应用于数字资产环境中的数据识别方法及*** | |
CN115640236B (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 | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20210921 |