Redis事务控制
1、Redis事务控制的相关命令汇总
MULTI | 表示开始收集命令,后面所有命令都不是马上执行,而是加入到一个队列中。 |
EXEC | 执行MULTI后面命令队列中的所有命令。 |
DISCARD | 放弃执行队列中的命令。 |
WATCH | “观察”、“监控”一个KEY,在当前队列外的其他命令操作这个KEY时,放弃执行自己队列的命令 |
UNWATCH | 放弃监控一个KEY |
我们先测试一下
MULTI
SET number 100
INCR number
EXEC
执行效果如下所示:
当我们执行中间出错时,整个事务都会失败而且回滚。
这里如果我们之前学过数据库的话,应该觉得很正常
但是当我们执行以下命令时
MULTI
SET number 1000
incr number
incr number
incriby number aaa
exec
运行结果如下
我们会发现整个事务并没有回滚
对于此官方解释了:
因我我们需要加强对生产环境中的错误异常处理
2、Redis乐观锁的体现
我们先来执行以下代码
set num 100
get num
watch num
MULTI
incr num
incr num
get num
然后我们新开一个客户端,设置了一下num的值
然后在刚才的界面执行EXEC
这时候我们会发现命令执行失败了,整个事务回滚了。
这就是一个乐观锁的体现,
简而言之就是、如果别人在我的队列命令执行之前,修改了我的数据,那我就直接放弃了。
乐观锁和悲观锁需要依据具体的实现进行使用
- 悲观锁(数据库中的行锁和表锁)
- 认为当前环境非常容易发生碰撞,所以执行操作前需要把数据锁定,操作完成后释放锁其他操作才能继续进行操作。
- 乐观锁
- 认为当前环境不容易发生碰撞,所以执行操作前不锁定数据,万一碰撞真的发生了,那么放弃自己的操作
Redis 内只有乐观锁,并无悲观锁,因为Redis对性能的要求很高。