您的位置:首页 > 数据库 > Redis

Redis之【假事务】

2019-10-30 10:43 197 查看

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

常用命令

  • redis事务的命令:multi/exec/discard  multi 指示事务的开始,exec 指示事务的执行,discard 指示事务的丢弃
  • 所有的指令在 exec 之前不执行,而是缓存在服务器的一个事务队列中,服务器一旦收到 exec 指令,才开执行整个事务队列,执行完毕后一次性返回所有指令的运行结果

 

Redis事务的原子性

  • 什么是原子性?简单的来说事务的原子性就是要么全部成功,要么全部失败,写个简单的例子来证明redis事务是否具有原子性。

         

  • 上面的例子可以看出,当我们执行incr name的时候出现了错误,但是get name 和 get age 还是成功了。证明了 redis的事务并不具有原子性,而是仅仅满足了事务的隔离性。隔离性中的串行化---当前事务有着不被其他事务打扰的权利。
  • 当我们使用redis的原子性时,通常都会与管道pipeline一起用,可以减少IO交互的次数。

 

watch

  • 考虑到一个业务场景,Redis 存储了我们的账户余额数据,它是一个整数。现在有两个并发的客户端要对账户余额进行修改操作,这个修改不是一个简单的 incrby 指令,而是要对余额乘以一个倍数。Redis 可没有提供 multiplyby 这样的指令。我们需要先取出余额然后在内存里乘以倍数,再将结果写回 Redis。
  • Redis 提供了这种 watch 的机制,它就是一种乐观锁。watch 会在事务开始之前盯住 1 个或多个关键变量,当事务执行时,也就是服务器收到了 exec 指令要顺序执行缓存的事务队列时,Redis 会检查关键变量自 watch 之后,是否被修改了 (包括当前事务所在的客户端)。如果关键变量被人动过了,exec 指令就会返回 null 回复告知客户端事务执行失败
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Redis