什么是事务

redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性按照顺序依次执行,中间不会被打断。

一个队列中,一次性、顺序性、排他性的执行一系列命令

  1. 事务的基本操作:
  • 开启事务(事务的开启位置) multi
  • 执行事务(事务的结束位置) exec
  • 取消事务 discard

加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行

  1. 例子
  2. 用户1先设置num=10,然后开启事务,并重新设置num=5,此时用户1还没有提交事务
  3. redis lua 事务 redis事务操作_redis

  4. 此时用户2对num设置为19,此时用户1还没有提交事务
  5. redis lua 事务 redis事务操作_分布式锁_02

  6. 此时用户1提交事务,再get num时值就变成了5,而不是19,然后在用户2中值也变成了5(这里就体现出事务的回滚)
  7. redis lua 事务 redis事务操作_分布式锁_03


  8. redis lua 事务 redis事务操作_事务_04

基于特定条件的事务执行——分布式锁

  1. 使用setnx设置一个公共锁 setnx lock-key value
  2. 使用expire为锁key添加时间限定
    expire lock-key second | pexpire lock-key milliseconds

业务场景
京东在618活动中,客户购买热情高涨,不一会儿就将所有商品购买完毕,如何避免最后一件商品不被多人同时购买(超卖问题),并且如果最后一个商品被别人买了会提示要在30分钟内付款,否则会取消订单,这样其他抢购的人会在页面上显示你还有机会,当前还有人未付款。

1) 用户1抢购到该商品

redis lua 事务 redis事务操作_事务_05


2) 由于此时给该商品加锁,因此用户2无法进行购买,只有解锁才可以进行操作

redis lua 事务 redis事务操作_提交事务_06