Redis事务

Redis单条命令是保证原子性的,Redis的事务是没有原子性的

Redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行

一次性,顺序性,排他性!执行一系列的命令

Redis事务没有隔离级别的概念

 

所有的命令在事务中,并没有被直接被执行,只有发起执行命令的时候才会被执行!Exec

 

redis的事务

 

  • 开启事务(multi)

  • 命令入队(……)

  • 执行事务(exec)

 

锁:redis可以实现乐观锁,watch(这是一个监视器的东西)

我们来实践一下:

 

 

 

 

 

 

 

 悲观锁和乐观锁

悲观锁:

  • 很悲观,认为什么时候都会出问题,无论做什么都会加锁,十分影响性能的。

乐观锁:

  • 很乐观,认为什么时候都不会出现问题,所以不会加锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据

  • 获取version

  • 更新的时候比较version

 

 

现在我们再开一个线程连接,在这个新的连接里去watch 这个money,然后去开始一个事务,但是先不执行这个事务

 

 

这个时候在这个新的连接里这个事务还没有执行的情况下,我们在之前的那个连接里突然去改变这个money的值

 

 最后我们再去完成这个事务就会提示,事务无法正常执行

 

 因此需要监控多线程修改值的时候,就可以使用这个watch来当作redis的乐观锁操作。就可以把watch看作同步锁一样

综上我们可以看到money已经发生变化了,也就是说之前watch拿到的money的值已经发生改变了,我们需要去重新定

义一下这个watch,重新去拿到这个money的值

 

 一般秒杀的时候用的就是乐观锁,这个面试常问的。

 

 

posted @ 2021-01-15 14:40  Yaoyaoo  阅读(79)  评论(0)    收藏  举报