Redis(三)【事务】

事务是指一系列操作步骤,这一系列的操作步骤,要么完全地执行,要么完全地不执行。

Redis 中的事务(transaction)是一组命令的集合,至少是两个或两个以上的命令,Redis 事务保证这些命令被执行时中间不会被任何其他操作打断。 

 

事务操作的命令:

  1)multi:标记一个事务的开始,事务内多条命令会按照现后顺序被放进一个队列当中。总是返回OK

  2)exec:执行所有事务块内的命令。事务内的所有执行语句内容,事务被打断,返回(nil)

  3)discard:取消事务,放弃执行事务块内的所有命令。总是返回OK

  4)watch key1 key2...:监视一个或多个key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断

  5)unwatch:取消watch命令对key的监视,如果在执行WATCH命令之后, EXEC命令或DISCARD命令先被执行了的话,那么就不需要再执行UNWATCH了 

 

事务的实现:

  1)正常执行事务:首先开启事务,其次向事务队列中加入命令,最后执行事务提交

    1.1)multi:用multi命令告诉Redis,接下来要执行的命令你先不要执行,而是把它们暂时存起来(开启事务

    1.2)sadd name rhett:第一条命令进入等待队列(命令入队) 

    1.3)sadd name secret:第二条命令进入等待队列(命令入队) 

    1.4)exce 告知 redis 执行前面发送的两条命令(提交事务)

   2)事务执行 exec 之前,入队命令错误(语法错误或者严重错误导致服务器不能正常工作(例如内存不足)),则放弃事务

 

   3)事务执行 exec 命令后,命令执行错误,事务提交 

    3.1)MULTI 正常命令

    3.2)SET username zhangsan 正常命令

    3.3)lpop username  正常命令,语法没有错误,执行命令时才会有错误

    3.4)EXEC 正常执行,发现错误可以在事务提交前放弃事务,执行discard. 

 

 在 exec 执行后的所产生的错误,即使事务中有某个/某些命令在执行时产生了错误, 事务中的其他命令仍然会继续执行。 Redis 在事务失败时不进行回滚,而是继续执行余下的命令。


Redis这种设计原则是:Redis 命令只会因为错误的语法而失败(这些问题不能在入队时发现),或是命令用在了错误类型的键上面,失败的命令并不是 Redis 导致,而是由编程错误造成的,这样错误应该在开发的过程中被发现,生产环境中不应出现语法的错误,就是在程序的运行环境中不应该出现语法的错误。而 Redis 能够保证正确的命令一定会被执行,再者不需要对回滚进行支持,所以Redis的内部可以保持简单且快速。

 

  4)放弃事务:首先开启事务,其次向事务队列中加入命令,最后执行DISCARD放弃事务,命令队列不会被执行

 

Redis的WATCH机制:使用 WATCH 监视一个或多个 key , 跟踪 key 的 value 修改情况时,如果有 key 的 value 值在事务 EXEC 执行之前被修改了,整个事务被取消。EXEC 返回提示信息,表示事务已经失败。 

WATCH 机制使事务 EXEC 变得有条件,事务只有在被 WATCH 的 key 没有修改的前提下才能执行。不满足条件,事务则被取消。使用 WATCH 监视了一个带过期时间的键,那么即使这个键过期了,事务仍然可以正常执行。

大多数情况下,不同的客户端会访问不同的键,相互同时竞争同一 key 的情况一般都很少,WATCH 能很好解决数据冲突的问题。 

  实现步骤:

    1)watch一个key,同时开启事务,输入更改value值的指令,暂时不执行EXEC

    2)开启一个新窗口,在新窗口中进入redis,并直接修改key中的值

 

     3)这时再回头执行之前的窗口,发现执行结果为空

 

posted @ 2020-05-28 00:05  Rhettttt  阅读(92)  评论(0)    收藏  举报