redis-事务

redis-事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
批量操作在发送 EXEC 命令前被放入队列缓存。
收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
开始事务。
命令入队。
执行事务。
redis事务不支持回滚
如果你有使用关系式数据库的经验, 那么 “redis 在事务失
败时不进行回滚,而是继续执行余下的命令”这种做法可能会让你觉得有点奇怪。以下是
这种做法的优点, redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发
现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命
令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环
境中。 因为不需要对回滚进行支持,所以 redis 的内部可以保持简单且快速。
redis命令只会因为错误的语法而失败,如果你执行语法的时候有错误,他会给你报失
败,或是命令用在了错误类型的键上面,比如说你刚才是一个string的k你去拿了一个set的命
令去执行它。这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,这句
话很重要,就是有的时候我们认为的失败并不是真正的失败,是你程序员逻辑不清晰,你
用错东西了,而且在企业当中肯定不可能,你开发完就上生产,中间肯定有一个测试的环
节,所以在生产系统之前,这些问题这些错误是应该会被发现而被修正的,对吧?而这些
错误应该在开发过程中被发现,就是这个测试环节。
另外一个因为不需要对回滚进行支持,所以redis内部可以保持简单且快速,除了你命
令错误,还有一种逻辑错误,是更清晰地,比如说本来应该是incr 加 1,但你不小心写错了
加2,这时候其实不止redis,接手你项目的人都不知道你到底想加几,他怎么给你做撤销

127.0.0.1:6379> help @transactions

  DISCARD -
  summary: Discard all commands issued after MULTI
  since: 2.0.0

  EXEC -
  summary: Execute all commands issued after MULTI
  since: 1.2.0

  MULTI -
  summary: Mark the start of a transaction block
  since: 1.2.0

  UNWATCH -
  summary: Forget about all watched keys
  since: 2.2.0

  WATCH key [key ...]
  summary: Watch the given keys to determine execution of the MULTI/EXEC block
  since: 2.2.0

127.0.0.1:6379> 

事务的命令就以上这些

127.0.0.1:6379> get k1
"124"
127.0.0.1:6379> MULTI    开启事务
OK
127.0.0.1:6379> INCR k1   累加一
QUEUED
127.0.0.1:6379> EXEC  执行 
1) (integer) 125
127.0.0.1:6379> WATCH k1   监控k1
OK
127.0.0.1:6379> MULTI  开启事务
OK
127.0.0.1:6379> INCR k1  另一个客户端对k1加一 即修改k1了 
QUEUED
127.0.0.1:6379> EXEC  执行失败
(nil)
//watch 监控的键  在事务执行期间被修改 则事务不会对其改变
127.0.0.1:6379> get k1
"127"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR k1
QUEUED
127.0.0.1:6379> DISCARD   推出取消事务
OK
127.0.0.1:6379> 




 
127.0.0.1:6379> watch k1  监控
OK
127.0.0.1:6379> UNWATCH  取消监控  在另一个客户端打开redis进行看=k1修改 最终可以执行成功该事务
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR k1
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 132

redis是单线程的,多个客户端的命令在服务端执行的时候会在一个队列按顺序执行,单个执行,多个事务提交,最终的执行顺序是看exec命令的提交顺序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值