Redis数据库系列Redis事务乐观锁和分布式锁

Posted 一宿君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis数据库系列Redis事务乐观锁和分布式锁相关的知识,希望对你有一定的参考价值。

第四章、Redis事务、乐观锁和分布式锁

什么是事务机制?

4.1、关系型数据库中的事务机制遵循ACID规则

关系型数据库例如mysql、Oracle;
事务的英文是transaction,以现实中的银行交易做示例,关系型数据库事务机制有四大特性:

  1. A(Atomicty)原子性:

    原子性,也就是说在事务里的所有操作,要么都做,要么都不做,事务成功的条件是事务中的所有操作都成功执行,只要有一个操作失败,整个事务失败,将会发生回滚。
    eg:银行转账,张三向李四转100元,分为两个步骤
    (1)、从张三账户取出100元
    (2)、向李四账户存入100元
    事务机制就是要保证,这两个步骤要么同时执行成功,要么同时执行失败;如果说没有事务机制,从张三账户取出100元的同时银行突然断电了,那么李四账户中却没有转入100元,这时候张三账户却少了100元,张三恼死也没底说理,你说这气不气?

  2. C(Consistency)一致性

    一致性也就是我们常说的数据的完整性约束,事务的运行不会改变数据的完整性约束。
    怎么说:例如a+b=10,如果一个事务改变了a,那么b随之也要改变,才能保证a+b的结果不会改变仍然为10,这就叫数据的完整性约束(即一致性),否则事务失败。

  3. I(Isolation)独立性(隔离性)

    事务的独立性,也就是我们常说的隔离性,所谓隔离性就是说并发事务彼此之间不会受到干扰,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交事务,第一个事务正在访问的数据就不会受到干扰。

  4. D(Durability)持久性

    持久性也就是说事务一旦提交,事务中所作的数据操作将会永久保存在数据库中,即使出现宕机现象数据也不会丢失。

4.2、非关系型数据库的事务机制(NoSql)

非关系型数据库例如Hbase、MongodDB、Redis;
这里我们讲解Redis数据库的事务机制

  • redis事务机制定义:

    • redis的事务机制中,可以一次执行多条命令,本质上是将一组命令放入集合队列中,而且这些命令将会被序列化,即按顺序执行并且不会被其他命令插入干扰和中断。
    • 在redis中,事务的作用就是在一个队列中,一次性、顺序性、排他性的执行一系列命令。
  • 事务的执行顺序和周期:

    • 创建事务:使用multi开启一个事务。
    • 加入队列:在开启事务后,每次操作的命令将会插入到队列中,并被序列化,同时这些命令在事务未提交前不会被执行。
    • 提交事务:使用exec提交事务。
  • 有关事务常用的命令

    • multi 开启事务,记录一个事务块的开始,执行后通常会返回OK,这个时候用户可以输入多条操作指令,redis将会把这些指令逐条放入集合队列中,然后序列化这些指令。
    • discard 回滚事务,要在提交事务之前使用,事务中所有的指令操作将会失效。
    • exec 提交事务,按顺序执行事务中的所有操作命令。
    • watch(类似于乐观锁) 监视一个或多个数据, 注意监视数据要在multi开启事务之前,如果在事务未提交之前,正监视的数据被其他用户所修改了,那么回头再提交这个事务,事务中的命令都会失效。
    • unwatch(释放锁)
    • setnx(分布式锁)是(set if not exists)的缩写,也就是说只有key不存在的时候才会设置

    setnx key value
    当且仅当key不存在时,将key的值设置为value;
    若设定的key已经存在,则setnx不做任何操作。

    • epxire (用于设置key的过期时间)
    #后面的second代表多少秒后释放该锁变量
    expire key second
    
    • pexpire(用于设置key的过期时间)
    #后面的miliseconds代表多少毫秒后释放该锁变量
    pexpire key miliseconds
    

4.3、实际操作演示

  • 开启事务和提交事务
    在这里插入图片描述
  • 如果事务过程中所包含的命令语法出现错误,在exec提交事务时,整个事务将会自动回滚;
    在这里插入图片描述
  • 而如果是命令逻辑赋值错误,在exec提交事务时,在这行赋值命令前面的正确命令都会事务提交成功,只有赋值错误这行代码会自动事务回滚。
    在这里插入图片描述
  • 事务回滚,一定要在提交事务之前进行回滚
    在这里插入图片描述
  • 监视(乐观锁)
    watch
  • 客户端1:
    在这里插入图片描述
  • 客户端2(在客户端1未提交事务之前另一个客户执行修改操作):
    在这里插入图片描述
  • 客户端1(此时客户端1提交事务,发现上述事务机制过程全部无效):
    在这里插入图片描述
  • 分布式锁
  • 客户端1:
    在这里插入图片描述
  • 客户端2(在客户端1设置的释放时间未到时,执行修改同一个变量的操作):
    在这里插入图片描述

以上是关于Redis数据库系列Redis事务乐观锁和分布式锁的主要内容,如果未能解决你的问题,请参考以下文章

redis08_redis的事务 multi(声明一个事务)exec(执行一个事务)redis里面为什么要有事务悲观锁和乐观锁(可以并发提高吞吐量)

Redis事务系列之二Redis实现乐观锁

Redis事务系列之二Redis实现乐观锁

redis乐观锁和悲观锁在spring boot的使用

redis乐观锁和悲观锁在spring boot的使用

redis乐观锁和悲观锁在spring boot的使用