1.Redis 事务定义
Redis 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis 事务的主要作用就是串联多个命令防止别的命令插队。
乐观锁 (Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。
Redis 就是利用这种 check-and-set 机制实现事务的。
2.事务的开启
Multi、Exec、discard
Redis 事务中有 Multi、Exec 和 discard 三个指令,在 Redis 中,从输入 Multi 命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入 Exec 后,Redis 会将之前的命令队列中的命令依次执行。而组队的过程中可以通过 discard 来放弃组队。
开启事务,进行执行
开启事务,放弃组队
3.Redis 事务中的两大命令错误:
(1) 组队中某个命令出现了错误,执行时整个的所有队列都会被取消。
例如:在设置键值对的时候,没有对键赋值,就会报错,在这种情况下去执行,队列就会呗取消。
(2) 如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。
例如:在组队命令中,对一个String使用其他类型的命令,那么在执行时,只有该语句不会执行,其他语句照样执行。
4.如何在Redis中使用乐观锁
watch命令
在执行 multi 之前,先执行 watch key1 [key2],可以监视一个 (或多个) key ,如果在事务执行之前这个 (或这些) key 被其他命令所改动,那么事务将被打断。
在上图中,都对k1进行了监视,开启队列后,都对k1进行修改操作,执行任务队列后,先执行的客户端完成了对k1的修改,第二个客户端在执行后发现k1的版本号不对了,第二个客户端的事务就被打断了。
unwatch命令
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/279920.html