文章目录
Redis中的事务操作(事务_锁机制_秒杀)
1、Redis的事务定义
- Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化,按顺序地执行。事务在执行过程中,不会被其他客户端发来的命令请求所打断。
- Redis事务的主要作用就是串联多个命令防止别的命令插队。
2、Multi、Exec、discard
- 从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec(类似于mysql中的提交事务)后,Redis会将之前的命令队列中的命令依次执行。
- 组队过程中可以通过discard(类似于mysql中的回滚事务)来放弃组队。
测试案例:
3、事务的错误处理
- 组队中某个命令出现了报告错误,执行时整个的所有队列都会被取消。
测试案例:
- 如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。
测试案例:
4、为什么要做成事务?
- 联想一个场景:有很多人有你的账户,同时去参加双十一抢购。
5、事务冲突的问题
5.1、例子
- 一个请求想给金额减8000
- 一个请求想给金额减5000
- 一个请求想给金额减1000
- Redis针对上述冲突问题有两种解决方式:悲观锁和乐观锁
5.2、悲观锁
5.3、乐观锁
- 例如:抢票就是乐观锁机制,所有人都能抢票,但是只有一个人可以支付成功。
5.4、乐观锁、悲观锁、共享锁、独占锁
5.5、WATCH key [key …]
测试案例:
原理理解:https://blog.youkuaiyun.com/neweastsun/article/details/106949294
- 我的理解是在使用WATCH命令监视之后,只要这个变量在EXEC命令执行之前修改了(无论是自己修改还是其他客户端修改),都会取消EXEC对于这个变量的执行。
5.6、unwatch
- 取消WATCH命令对所有key的监视。
- 如果在执行WATCH命令之后,EXEC命令或DISCARD命令先被执行了的话,那么就不需要再执行UNWATCH了。