1。总结:

与许多其他的数据库,redis也提供了一个交易机制作为NoSQL数据库。在Redis,四的命令多/执行/抛弃/手表是我们的交易执行的基石。我相信这个概念不是新的那些在关系数据库开发经验的开发商。尽管如此,我们将简要地列出交易在redis实施的特点。

1)。事务中的所有命令将按顺序执行。在交易执行,Redis将不再为其他客户提供任何服务,所以在事情所有的命令都是由原子。

2)。相比于关系数据库中的事务,如果一个命令失败在Redis的事务,随后命令仍将执行。

3)。我们可以通过多个命令打开一个事务,有关系数据库开发经验的人可以理解它为开始事务语句。语句之后执行的命令将被视为事务中的操作。最后,我们可以提交/回滚所有操作在事务执行exec或丢弃的命令。这两个redis可以认为等于犯在一个关系数据库/回滚语句。

4)交易前打开,如果所有的客户端和服务器通信故障造成的网络断开之间,随后的所有可执行语句不会被服务器执行。然而,如果网络中断事件发生时,客户端执行exec命令后,在交易的所有命令都由服务器执行。

5)。当使用附加的唯一模式,Redis写的都是写在交易操作通过调用系统函数写在这个叫写所有的磁盘。然而,如果系统崩溃发生在写作的过程中,如引起停机断电,所以只有部分数据被写入到磁盘,而另一部分数据已经丢失。redis服务器将执行一系列必要的一致性检查时重新启动。一旦发现类似的问题是,它会立即退出,并给出相应的错误提示。在这一点上,我们必须充分利用这一工具在Redis Redis检查工具包提供,它可以帮助我们找到数据不一致的错误并回滚一些已写入的数据。修复后,我们可以Redis服务器再次启动。

两。相关命令列表:





命令的原型
时间复杂度
命令描述
返回值


多种

它用于标记事务的开始,随后执行的命令将存储在命令队列中,直到执行执行,直到原子执行命令为止。
恢复正常


exec

执行交易指令队列中的所有命令,而当前连接的状态恢复到正常状态,非事务性的状态。如果看命令执行交易,exec命令可以执行所有的命令,只有当交易队列观察监测的关键是不能修改的,否则执行将放弃当前交易的所有命令。
原子返回事务中的每个命令的返回。如果在事务中使用了表,一旦放弃了事务,执行将返回到null多容量应答。


丢弃

回滚命令在事务队列和恢复当前连接的状态到正常状态,即非交易状态。如果手表命令,命令把所有的unwatch键。
恢复正常。


关键watchkey {…}
o(1)
在执行多个命令之前,可以指定要监视的键。但是,在执行执行前,如果修改了修改过的键,执行器将放弃事务队列中的所有命令。
恢复正常。


unwatch
o(1)
取消当前事务中指定的键。如果执行执行或放弃命令,则不需要手动执行该命令,因为在此之后,所有监视的键将自动取消。
恢复正常。







三。An example of the command:

1。事务通常执行:

复制代码代码如下所示:

# Redis在shell命令行客户端工具。

使用CLI / >

在目前的#连接启动一个新事务。

Redis 127.0.0.1:6379 >多

好啊

第一个命令#行政事务,从订单的回归结果可以看出,该命令是不立即执行,但在命令队列的事务。

Redis 127.0.0.1:6379 >增加T1

排队

#和新指令的实施,它从结果中可以看出,顺序存储在事务队列。

Redis 127.0.0.1:6379 >增加T2

排队

#交易的所有命令队列中的命令,可以看到的结果,结果返回到命令队列。

Redis 127.0.0.1:6379 >执行

1)(整数)1

2)(整数)1



2的失败指挥。交易:

复制代码代码如下所示:

#开辟了一个新的交易。

Redis 127.0.0.1:6379 >多

好啊

#设置关键值为字符串类型3。

Redis 127.0.0.1:6379 > 3集

排队

从#弹出元素键关联的值的头,因为该值是一个字符串类型,和LPOP命令只能用于列表类型,所以在EXEC命令的执行,该命令将失败。

Redis 127.0.0.1:6379 > LPOP一

排队

#再次设置键值字符串4。

Redis 127.0.0.1:6379 > 4集

排队

#的核心价值,以确定该值是否在第二设置命令的事务设置成功。

Redis 127.0.0.1:6379 >得到

排队

#从结果中可以看出,在LPOP失败事件的第二命令和设置和获取命令执行成功,这一点是交易和Redis的交易关系数据库之间最重要的区别。

Redis 127.0.0.1:6379 >执行

1)好的

2)对持有错误值的键进行错误操作

3)好的

4)4



三.回滚事务:

复制代码代码如下所示:

#设置事务之前的T2值执行的关键。

Redis 127.0.0.1:6379 >设置T2 TT

好啊

# start a transaction.

Redis 127.0.0.1:6379 >多

好啊

#在交易设置一个新值的关键。

Redis 127.0.0.1:6379 >设置T2 ttnew

排队

放弃#事务。

Redis 127.0.0.1:6379 >丢弃

好啊

#检查T2的核心价值,可以从核心价值的结果看作是交易的价值开始之前。

Redis 127.0.0.1:6379 >获得T2

TT



四,监视命令和基于CAS的乐观锁:

在Redis的事务,表命令可以用来提供CAS(检查和设置)功能。假设我们监视多个键通过观察命令执行的交易之前。如果在监视之后有任何键值更改,则将执行由执行命令执行的事务。同时,空多体回复将返回通知调用方的事务执行失败。例如,我们再次假设不提供增加Redis命令实现原子性的关键值的增加。如果我们想实现这个功能,我们只能自己编写相应的代码,它的伪代码如下所示:

复制代码代码如下所示:

val =得到钥匙

1

集MyKey美元价值



上面的代码可以保证执行的结果是只在一个单一的连接正确,如果在同一时间同时在代码实现的客户数量,然后会有一个错误的场景经常出现在多线程程序中,比赛竞争(竞争条件)。例如,客户和B阅读MyKey的原有价值的同时,假设值为10。之后,两个客户端设置服务器的redis添加值,结果在MyKey的11,而不是12,我们认为,要解决类似的问题,我们需要看命令的帮助去看下面的代码:

复制代码代码如下所示:

手表钥匙

val =得到钥匙

1

多种

集MyKey美元价值

exec



和代码不同的是,以前通过看指挥监测关键的MyKey的值的第一个访问新的代码,然后设置命令包围在交易,使他们能够有效地执行前执行确保每一个连接,如果当前连接获得MyKey的价值是连接的客户端,所以对exec命令连接会失败。这样,对方可以了解是否有价值已经重新配置成功后判断返回值。