事务简介

总结:保证命令按顺序执行

  1. Redis中事务,不同于传统的关系型数据库中的事务。
  2. Redis中的事务指的是一个单独的隔离操作。
  3. Redis的事务中的所有命令都会序列化、按顺序地执行且不会被其他客户端发送来的命令请求所打断。
  4. Redis事务的主要作用是串联多个命令防止别的命令插队

事务常用命令

MULTI 标记一个事务块的开,也就是组队 组队失败的情况:
1、自作自受:运行是才能发现的错误,如incr 输入参数不符合
image.png
2、殃及鱼池:遇到编译错误,所有指令都不再执行
image.png
EXEC 执行事务中所有在排队等待的指令并将链接状态恢复到正常 当使用WATCH 时,只有当被监视的键没有被修改,且允许检查设定机制时,EXEC会被执行 image.png
DISCARD 刷新一个事务中所有在排队等待的指令,并且将连接状态恢复到正常。
如果已使用WATCH,DISCARD将释放所有被WATCH的key。
WATCH 标记所有指定的key 被监视起来,在事务中有条件的执行(乐观锁) watch key
multi
指令操作。。。
exec

锁(watch)

悲观锁

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

乐观锁

image.png
执行操作前假设当前操作不会被打断(乐观)。基于这个假设,我们在做操作前不会锁定资源,万一发生了其他操作的干扰,那么本次操作将被放弃。

乐观锁与悲观锁区别:

悲观锁还会根据条件判断是否进行操作
乐观锁看到版本更改,立刻结束操作

Redis中的锁策略

  1. Redis采用了乐观锁策略(通过watch操作)。乐观锁支持读操作,适用于多读少写的情况!
  2. 在事务中,可以通过watch命令来加锁;使用 UNWATCH可以取消加锁;
  3. 如果在事务之前,执行了WATCH(加锁),那么执行EXEC 命令或 DISCARD 命令后,锁对自动释放,即不需要再执行 UNWATCH 了

image.png