事物这东西相信你们都不陌生吧,在学习Spring,Mybatis等框架中,数据库
只要是涉及到数据存储和修改的,都会有事物的存在,并发
废话就很少说了下面咱们来简单的介绍下Redis事物以及锁。框架
Redis 事务能够一次执行多个命令, 而且咱们来了解几个重要的知识点:学习
事物执行的三个阶段:spa
DISCARD | 取消事务,放弃执行事务块内的全部命令。 |
EXEC | 执行全部事务块内的命令。 |
MULTI | 开启事物 |
UNWATCH | 取消 WATCH 命令对全部 key 的监视。 |
WATCH key | 监视一个(或多个) key ,若是在事务执行以前这个(或这些) key 被其余命令所改动,那么事务将被打断。 |
放弃事物,队列里面的命令将不会执行。3d
一个命令出错,队列中的所有命令将不会执行。blog
这个例子跟上面的差很少,只不过这个例子是执行了之后再报错,他两不一样的地方就是队列
上面是先知道错误,这个是执行后才知道错误了,举个例子吧,事务
好比 我要让个人Redis数据数值增一操做,我在控制台执行命令,INCR key 当事物还没执行的时候,字符串
也就是说这个命令还在队列中,还没执行,它是不知道我这个key究竟是个数值仍是个字符串,
假设key不是个数值类型那么当执行事物后,这条命令将会报错,其余的命令正常执行。
我这里就拿个花呗额度来举例,假设个人balance为余额,arrears为欠下的余额,下面这张图为
无加塞篡改,先监控在开启multi,保证两笔金额变更在同一事物内,一块儿执行。
相似于我在修改这个数据的时候,被其余用户已经修改了,已经被加上锁了,我本身就修改不了了,要等被人修改完才可以修改,这跟上面的乐观锁很类似,
我开启两个控制台,一个用来正常操做,一个用来中途篡改数据。
WATCH 监视一个(或多个) key ,若是在事务执行以前这个(或这些) key 被其余命令所改动,那么事务将被打断。
下面咱们来看图.
我还没执行这些命令以前我根本不知道个人数据已经在被人修改了,当我要修改数据的时候已经被人先改了。
这时候咱们UNWATCH命令就派上用场了,至关于当我修改数据的时候我就把锁加上,修改完成后就把锁解开,让下一我的继续修改数据,
取消 WATCH 命令对全部 key 的监视,一旦咱们执行EXEC之后全部监控锁都会被取消掉。
下面咱们来看图
后面还会更新如何使用RedisTemplate来操做Redis命令,如何解决Redis穿透/雪崩等。
文章就写到这里了,若是文章有须要改进的地方请大佬们在评论区里留言,谢谢点评。