redis的事务

redis事务和传统关系数据库的事务并不相同。在关系数据库中,用户首先向数据库服务发送begin,然后执行各个相互一致的写操作和读操作。最好,可以选择发送commit来确认之前所做的修改,或者发送rollback来放弃那些修改。redis的事务以特殊命令mulit开始,之后跟着用户传入的多个命令,最好以exec结束。redis在执行事务的过程中,会延迟执行已入队的命令直到客户端发送exec命令为止。

在使用python客户端时,会等到事务所包含的所有命令都出现了之后,才一次性将mult命令,要在事务中执行的一系列命令,以及exec命令全部发送给redis,然后等待直到接收到所有命令的回复为止。这种“一次性发送多个命令,然后等待所有回复出现”的做法通常被称为流水线,它可以通过减少客户端与redis服务器之间的网络通信次数来提升redis在执行多个命令时的性能。

redis在一次单独步骤中执行一组命令,并且可以保证如下两个重要事项:

> Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求。这样便能保证Redis将这些命令作为一个单独的隔离操作执行。 
> 在一个Redis事务中,Redis要么执行其中的所有命令,要么什么都不执行。因此,Redis事务能够保证原子性。

与实务相关命令介绍:

  • MULTI命令:用于标记事务块的开始。redis会将后续的命令逐个放入队列中,然后才能使用exec命令原子化的执行这个命令序列。
  • EXEC命令:在一个事务中执行所有先前放入队列的命,然后恢复正常的连接状态。这个命令返回一个数组,其中的每个元素分别是原子化事务中每个命令的返回值。当使用WATCH命令时,如果事务执行中止,那么EXEC命令就会返回一个Null值。
  • DISCARD命令:清楚所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态。如果使用来WATCH命令,那么DISCARD命令就会将当前连接监控的所有键取消监听。
  • WATCH命令:当某个事务需要按条件执行时,就需要使用这个命令将给定的键设置为受监控的。
  • UNWATCH命令:清楚所有先前为一个事务监控的键。如果使用来exec命令和DISCARD命令,那么就不需要手动调用unwatch命令。

WATCH命令:

在使用watch命令对键进行监视之后,直到用户执行exec命令的这段时间里,如果有其他用户抢先对任何被监视的键进行了替换,更新,删除操作,那么当用户尝试执行exec命令的时候,事务将失败并返回一个错误。

原文地址:https://www.cnblogs.com/wxzhe/p/10783830.html