Redis事务操作
事务操作
- Redis事务的主要作用就是
串联多个命令
防止别的命令插队Muti
、Exec
、discard
:
(1)从输入Muti
命令开始,输入的命令都会依次进入命令队列,但不会执行
(2)直到输入Exec
命令后,Redis会将之前的命令队列中的命令依次执行
(3)组队过程中可以通过discard
来放弃组队
(4)Muti
表示事务开启,执行完Exec
或discard
表示事务结束
- 事务的错误处理:
- 若组队中某个命令出现了错误,执行时整个的队列都会被取消
- 如果在执行阶段某个命令出现了错误,则只有报错的命令不会被执行,其余命令还是会执行,不会回滚
乐观锁与悲观锁
- 悲观锁:
悲观锁
顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次拿数据都会上锁,这样别人想拿数据就会被阻塞- 传统的关系型数据库中
行锁
、表锁
、读锁
、写锁
都是在操作之前先加锁,缺点是效率低
- 乐观锁:
乐观锁
顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以每次拿数据都会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制乐观锁
适用于多读的应用类型,可以提高吞吐量
- 乐观锁与悲观锁的使用:
WATCH key [key ...]
在执行multi
之前,先执行Watch
,可以监视一个或多个key
,如果在事务执行之前这个(这些)key
被其他命令所改动,那么事务将被打断(不会被执行)unwatch
取消Watch
命令对所有key
的监视,如果执行watch
命令后Exec
或discard
命令先被执行,就不需要执行unwatch
了
Redis事务三特性
单独的隔离性:
事务的所有命令多会被序列化,按顺序执行,事务在执行过程中,不会被其他客户端发送的命令请求锁打断没有隔离级别的概念:
队列中的命令在没有提交之前不会实际被执行,因为事务在提交前任何命令都不会被执行不保证原子性:
事务中如果有一条命令失败后,其后的命令仍然会被执行,没有回滚