Redis

作者: eleven_a1dc | 来源:发表于2018-11-27 16:50 被阅读11次

    redis 事务 transaction
    相关命令

    • DISCARD
    • EXEC
    • MULTI
    • UNWATCH
    • WATCH

    事务

    multi, exec, discard, watch 是redis 事务的基础。他们允许在单个步骤执行一组命令。有两个重要的保证。

    • 在一个事务的所有命令 都被序列化并且顺序执行。永远不会发生在一个事务的执行的时候另一个client 插入一条请求。这保证了这些命令作为单个隔离的命令。
    • 命令要么全部执行,要么全都不执行。所以Redis 事务是原子的
      EXEC 命令触发这个事务的所有命令的执行。

    使用

    使用multi 命令开始Redis的事务,这个命令总是返回ok。此时用户可以发出多个命令。而不是执行这些命令。redis 会把它放队列里。一旦EXEC命令被调用,所有命令都会被执行
    调用discard 会刷新这个事务 队列,并且退出事务。

    > MULTI
    OK
    > INCR foo
    QUEUED
    > INCR bar
    QUEUED
    > EXEC
    1) (integer) 1
    2) (integer) 1
    

    exec 返回一个返回值的数组。这个数组的每个元素是这个事务的每个命令的响应,按命令相同的顺序执行。

    在事务里的错误

    在一个事务中可能会出现以下这两种错误

    • 一种是在exec 命令调用之前,例如: 语法错误,内存不够
    • 在调用exec 命令之后,例如: 针对字符串值调用列表的操作
      在redis 2.6.5 之后,服务器针对第一种错误会拒绝执行事务,并返回一个错误。自动丢弃这个事务。
      在redis2.6.5 之前,会执行正确的那些命令。所以新的行为(2.6.5 之后的行为)能够使他更简单的修复事务。
      exec命令调用失败之后: 所有其他命令都会被执行,即时有些命令执行失败了。
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set a 3
    QUEUED
    127.0.0.1:6379> lpop a
    QUEUED
    127.0.0.1:6379> set a 2
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
    3) OK
    127.0.0.1:6379> get a
    "2"
    

    redis 事务不支持回滚
    为什么不支持回滚?

    • redis 命令失败的原因只会是语法错误

    • redis 内部更简单,更快,因为不需要回滚

    WATCH

    乐观锁
    watch 被用来提供check-and-set(CAS) 行为对于redis 事务
    例子
    client 1

    > watch a
    > multi
    > incr a
    

    client2

    > multi
    > incr a
    > exec
    

    然后client1

    > exec
    (nil)
    

    当监视的key 在事务期间内被修改了,那exec命令会返回nil来通知事务失败了。

    相关文章

      网友评论

        本文标题:Redis

        本文链接:https://www.haomeiwen.com/subject/edklfqtx.html