9、Redis事务详解

事务

  1. 事务本质:一组命令的集合!
    • 一个事务的所有命令都会被序列化,在事务执行的过程中,会按照顺序执行。
    • 一次性
    • 顺序性
    • 排他性
    • 执行一系列的命令!
    • Redis事务没有隔离级别的概念!
    • 所有的命令在事务中,并没有直接执行!只有发起执行命令才会执行!Exec
  2. Redis单条命令是保证原子性的。要么同时成功,要么同时失败,原子性!
  3. redis的事务!
    • 开启事务
    • 命令入队
    • 执行事务
  4. 正常执行事务
    127.0.0.1:6379> multi #开启事务
    OK
    127.0.0.1:6379(TX)> set k1 v1
    QUEUED
    127.0.0.1:6379(TX)> set k2 v2
    QUEUED
    127.0.0.1:6379(TX)> get k1
    QUEUED
    127.0.0.1:6379(TX)> exec #执行事务中的内容
    1) OK
    2) OK
    3) "v1"
    
    
  5. 取消事务!
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379(TX)> set k3 v3
    QUEUED
    127.0.0.1:6379(TX)> discard #取消事务的执行内容
    OK
    127.0.0.1:6379> get k3
    (nil)
    
    
  6. 编译型异常(代码有问题!命令有错,事务所有的命令都不执行!)
    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> multi #开启事务
    OK
    127.0.0.1:6379(TX)> set k1 v1
    QUEUED
    127.0.0.1:6379(TX)> set k2 v2
    QUEUED
    127.0.0.1:6379(TX)> getset k3 #使用错误命令,发现报错
    (error) ERR wrong number of arguments for 'getset' command
    127.0.0.1:6379(TX)> set k3 v3
    QUEUED
    127.0.0.1:6379(TX)> exec #由于事务中存在错误命令,将不会执行命令!
    (error) EXECABORT Transaction discarded because of previous errors.
    127.0.0.1:6379> get k1 
    (nil) #获取不到当前的k1的值
    
  7. 运行时一场(1/0),如果事务队列存在语法型,那么执行命令的时候,其他的命令是可以正常执行的,错误命令抛出异常!!!
    127.0.0.1:6379> set k1 "k1" #首先设置k1为一个字符串
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379(TX)> incr k1 #对k1进行自增,但是k1为字符串,不可以自增
    QUEUED
    127.0.0.1:6379(TX)> set k2 v2
    QUEUED
    127.0.0.1:6379(TX)> get k2
    QUEUED
    127.0.0.1:6379(TX)> exec
    1) (error) ERR value is not an integer or out of range
    2) OK #除了出错的命令,其他的都可以正常执行!!!
    3) "v2"
    127.0.0.1:6379> get k2
    "v2"
    
  8. 悲观锁!
    • 很悲观,认为什么时候都会出现问题,无论做什么都会加锁
  9. 乐观锁!
    • 很乐观,认为什么时候都不会出现问题,所以不会上锁,更新数据的时候去判断下,在此期间,是否有人修改过这个数据!!!
    • 获取version
    • 更新时候比较version
  10. Redis监视测试!!
    • 正常执行成功!
    • 127.0.0.1:6379> set money 100
      OK
      127.0.0.1:6379> set out 0
      OK
      127.0.0.1:6379> watch money #监视money
      127.0.0.1:6379> multi #进入事务
      OK
      127.0.0.1:6379(TX)> decrby money 10
      QUEUED
      127.0.0.1:6379(TX)> incrby out 10
      QUEUED
      127.0.0.1:6379(TX)> exec
      1) (integer) 90
      2) (integer) 10
      #发现更改成功
      
    • 测试多线程修改值,监视失败,相当于乐观锁,使用watch可以当做redis乐观锁操作
    • 127.0.0.1:6379> watch money
      OK
      127.0.0.1:6379> multi
      OK
      127.0.0.1:6379(TX)> decrby money 10
      QUEUED
      127.0.0.1:6379(TX)> incrby out 10
      QUEUED
      127.0.0.1:6379(TX)> exec
      (nil)
      #当当前的线程watch这一个数据时候,而在另一个线程进行操作了当前数据,就不会被执行成功!!
      
    • 如果监视失败,则进行解锁
    • 127.0.0.1:6379> unwatch #解锁过程!!
      OK
      127.0.0.1:6379> watch money #重新监视
      OK
      127.0.0.1:6379> multi #进行实务操作!!
      OK
      127.0.0.1:6379(TX)> decrby money 10
      QUEUED
      127.0.0.1:6379(TX)> incrby out 10
      QUEUED
      127.0.0.1:6379(TX)> exec
      1) (integer) 60
      2) (integer) 40
      
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

躺平崽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值