锁分为悲观锁和乐观锁,redis只支持乐观锁

一个例子

  1. 银行账户一共有10000元
  2. 三个客户在三个取款机上操作
    1. A客户想取7000
    2. B客户想取5000
    3. C客户想取3000

悲观锁

一般传统的数据库中都是这种操作,比如表锁与行锁

  • 在悲观锁的观点下,每一次操作都会修改数据,所以每一次拿数据的时候都会上锁
  • 也就是说在悲观锁的情况下,这三个客户是不允许在三个取款机上操作的,只能在一个取款机上操作
    • 因为当有一个客户在唯一的一台取款机上操作的时候,其他客户是不能操作的(不能动这比存款)

乐观锁

  • 在乐观锁的观点下,每一次操作都不会修改数据,所以不会上锁,但是会在更新数据的时候判断一下是否有人修改了数据
  • 也就是说三个客户在三个取款机上面操作,每个人操作的时候能看到的金额是10000,但是当真正取款的时候,可能由于其他客户的操作而导致自己取不到想要的金额
  • 这个就优点秒杀的性质了

代码

  • WATCH key [key ...],当前命令可以监视一个或者多个key,如果事务执行之前,这些key被其他命令改动,那么事务将会被打断
  1. 我们设置一个numbkey,他的value为10
  2. 打开两个终端,这两个终端可以当做是两个取款机,并在这两个终端下监视numb
  3. 两个终端都开启事务,第一个终端numb + 10 放入队列中,第二个终端 numb + 20放入队列中
  4. 将第一个终端队列的命令执行,然后将第二个终端的命令执行

第一个终端
在这里插入图片描述

第二个终端

在这里插入图片描述

我们会发现第一个终端的任务执行成功了,第二个终端的任务就会执行失败了

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐