浅谈Redis事务

目录

Redis事务简介

事务过程

开启事务

命令入队

取消事务

执行事务

锁机制

悲观锁

乐观锁

Watch

UnWatch

应用场景

Redis事务特性


本文单一根据Redis事务来进行讲解,如有错误,请指教,谢谢!

Redis事务简介

Redis事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

Redis事务的主要作用就是串联多个命令防止别的命令插队。

事务过程

当我们在Redis中开启(Multi)一条事务之后,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将命令队列中的命令依次执行。当然在Exec之前我们可以通过Discard来放弃命令队列中的命令来取消事务。

开启事务

执行MULTI命令表示开启事务,此时客户端会从非事务状态切换到事务状态。

命令入队

开启事务后,接收到命令,则会将命令按顺序的放入队列存储起来,并不会直接执行。

如果接收到这些特殊的指令DiscardExecWatch则会直接执行。

如果接收到错误的命令,比如

seeeet k1 v1

那么整个命令队列在执行时,会被取消执行。

取消事务

可以通过Discard命令来放弃队列中的命令并取消此次事务。

执行事务

通过执行Exec命令,Redis会将队列中的命令按先进先出顺序依次执行。

整个执行过程不具有原子性,但执行过程中的单条命令具有原子性,如果其中一条执行失败并不会妨碍其他指令的执行,并不具有回滚的操作。

所有执行的命令的执行结果也会按顺序的放入一个队列存储起来,在全部执行完成之后按先进先出顺序进行返回给客户端,最后事务执行完毕并结束本次事务。

锁机制

悲观锁

顾名思义,很悲观,认为当拿到数据后别人可能会修改数据,所以在每次拿到数据后就会上锁,这样别人再拿该数据时就会阻塞直接拿到的人释放锁。

传统的关系型数据库中就有很多用到了这种锁机制,如行锁,表锁,读锁,写锁都是在操作之前先上锁。

乐观锁

顾名思义,很乐观,认为当拿到数据后别人不可能会修改数据,但是当操作该数据时,会判断该数据与拿到时是否一致,一旦被别人修改过,则操作失败。

类似于拿到时该数据version为1,如果有他人修改则version就会变化,当我们去操作时会判断该数据的版本是否为1。

Watch

Watch指令是乐观锁的方式,用于在事务开始之前对一个或多个key进行监视,在事务执行时如果这些key被别人修改过,则整个事务执行失败。

UnWatch

取消 WATCH 命令所监视的所有key。

当事务执行完成,执行失败或取消事务,则自动释放Watch锁监视的key。

应用场景

当我们的账户有1000rmb,然后手机端和电脑端同时登陆了我们的账户,同时发送消费500和800的请求,如果不加锁机制,则会出现-300的余额,这显然是血赚。

Redis事务特性

单独的隔离操作

事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

没有隔离级别概念

队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行。

不保证原子性

事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值