事务简介
总结:保证命令按顺序执行
- Redis中事务,不同于传统的关系型数据库中的事务。
- Redis中的事务指的是一个单独的隔离操作。
- Redis的事务中的所有命令都会序列化、按顺序地执行且不会被其他客户端发送来的命令请求所打断。
- Redis事务的主要作用是串联多个命令防止别的命令插队
事务常用命令
| MULTI | 标记一个事务块的开,也就是组队 | 组队失败的情况: 1、自作自受:运行是才能发现的错误,如incr 输入参数不符合 ![]() 2、殃及鱼池:遇到编译错误,所有指令都不再执行 ![]() |
|---|---|---|
| EXEC | 执行事务中所有在排队等待的指令并将链接状态恢复到正常 当使用WATCH 时,只有当被监视的键没有被修改,且允许检查设定机制时,EXEC会被执行 | ![]() |
| DISCARD | 刷新一个事务中所有在排队等待的指令,并且将连接状态恢复到正常。 如果已使用WATCH,DISCARD将释放所有被WATCH的key。 |
|
| WATCH | 标记所有指定的key 被监视起来,在事务中有条件的执行(乐观锁) | watch key multi 指令操作。。。 exec |
锁(watch)
悲观锁

执行操作前假设当前的操作肯定(或有很大几率)会被打断(悲观)。基于这个假设,我们在做操作前就会把相关资源锁定,不允许自己执行期间有其他操作干扰。
Redis不支持悲观锁。Redis作为缓存服务器使用时,以读操作为主,很少写操作,相应的操作被打断的几率较少。不采用悲观锁是为了防止降低性能。
乐观锁

执行操作前假设当前操作不会被打断(乐观)。基于这个假设,我们在做操作前不会锁定资源,万一发生了其他操作的干扰,那么本次操作将被放弃。
乐观锁与悲观锁区别:
悲观锁还会根据条件判断是否进行操作
乐观锁看到版本更改,立刻结束操作
Redis中的锁策略
- Redis采用了乐观锁策略(通过watch操作)。乐观锁支持读操作,适用于多读少写的情况!
- 在事务中,可以通过watch命令来加锁;使用 UNWATCH可以取消加锁;
- 如果在事务之前,执行了WATCH(加锁),那么执行EXEC 命令或 DISCARD 命令后,锁对自动释放,即不需要再执行 UNWATCH 了




