Redis系列之事务机制

什么是Redis事务

学习mysql数据库的时候,我们知道了事务的ACID特性,Redis也是支持事务的,不过和数据库的事务又有什么区别?在mysql数据库中,我们使用begin开启事务,提交是commit,回滚是rollback,然后Redis中的事务是怎么一回事?redis的事务其实可以看做是一组命令按照顺序,串行执行队列中的命令,其它客户端的命令不会写入到这个队列中。总的来说,redis事务就是一次性、顺序性、排他性的执行一个队列中的一组命令

redis事务相关命令和使用

MULTI 、 EXEC 、 DISCARD 和 WATCH、UNWATCH命令是redis实现事务需要的命令

  • multi:开启事务,事务开启后,事务中的多条命令会排队,等事务提交
  • discard:取消事务,放弃执行队列里的所有命令
  • exec:执行事务里的所有命令
  • watch:监控一个或者多个key,如果事务提交之前,这个key被其它客户端修改了,这个事务就不会提交
  • unwatch: 取消watch对所有key的监视

redis事务例子

  • 正常的事务执行过程
127.0.0.1:0>multi
"OK"

127.0.0.1:0>incr testid
"QUEUED"

127.0.0.1:0>exec
 1)  "1"
  • 语法错误导致的事务回滚
127.0.0.1:0>multi
"OK"

127.0.0.1:0>incr testid
"QUEUED"

127.0.0.1:0>seta a
"ERR unknown command `seta`, with args beginning with: `a`, "

127.0.0.1:0>exec
"EXECABORT Transaction discarded because of previous errors."
  • 对string类型进行incr
    对一个key先设置为string类型的,然后使用incr命令进行递增,再提交事务,出现错误
127.0.0.1:0>set testid aa
"OK"

127.0.0.1:0>multi
"OK"

127.0.0.1:0>incr testid
"QUEUED"

127.0.0.1:0>exec
 1)  "ERR value is not an integer or out of range"
  • 手动回滚
127.0.0.1:0>multi
"OK"

127.0.0.1:0>incr id
"QUEUED"
127.0.0.1:0>discard
"OK"
  • watch命令使用
    watch命令有点像cas锁,check-and-set,事务开启后,其它客户端更改了值,事务不执行
127.0.0.1:0>watch id
"OK"
127.0.0.1:0>multi
"OK"
127.0.0.1:0>set id 1
"QUEUED"
127.0.0.1:0>get id
"QUEUED"

另外一个客户端设置key的值

127.0.0.1:0>set id 2
"QUEUED"

客户端1再提交事务

127.0.0.1:0>exec
 (nil)

redis事务特点

  • 命令是原子性的,在执行事务中的指令时,不能执行其它指令,但是redis是保证分布式的ap模式的,不能保证cp特性,所以一般对业务要求严格的也不采用redis事务
  • redis事务可以在一定程度保证原子性,但是不能获取事务中间指令的结果,然后再决定后面的执行逻辑,所以这种业务场景也不适用,这时候可以使用lua脚本来实现

相关推荐

  1. Redis系列事务机制

    2023-12-18 20:36:03       38 阅读
  2. Redis 教程系列Redis 事务(十六)

    2023-12-18 20:36:03       23 阅读
  3. Redis中的事务机制

    2023-12-18 20:36:03       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-18 20:36:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-18 20:36:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-18 20:36:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-18 20:36:03       20 阅读

热门阅读

  1. RC4系列

    2023-12-18 20:36:03       30 阅读
  2. gcov在嵌入式设备上使用说明更新

    2023-12-18 20:36:03       35 阅读
  3. C++入门(2)

    2023-12-18 20:36:03       27 阅读
  4. 高效运营的企业电脑监控软件有哪些?

    2023-12-18 20:36:03       40 阅读
  5. 深入理解Python中的 `yield` 和 `yield from`

    2023-12-18 20:36:03       30 阅读
  6. 秋季面试 redis 相关面试题

    2023-12-18 20:36:03       40 阅读
  7. 核和值域的关系:什么是矩阵的秩?

    2023-12-18 20:36:03       22 阅读
  8. 深入理解C语言中的指针运算和数组比较

    2023-12-18 20:36:03       30 阅读
  9. vue 高频面试题

    2023-12-18 20:36:03       45 阅读