Redis的基本事务操作以及Redis实现乐观锁

    科技2026-06-13  4

    事务

    在我们学习关系型数据库MYSQL的时候,就了解过Mysql的事务的特性(ACID)。

    Nosql中redis的单条命令是具备原子性的, 但是在Redis事务中式不具备原子性的!也没有隔离级别的概念!

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

    ------队列 set set set 执行--------

    Redis事务的特性:一次性,顺序性,排他性!

    所有的命令在事务中,并不是之间执行!而是通过发起执行命令的时候才会执行!(通过Exec命令)

    Redis的事务:

    开启事务(multi)命令入列(…)执行事务(exec)

    演示Redis事务正常执行!

    演示放弃事务(discard):当我们放弃事务的时候,说明入列的命令并没有执行。

    演示事务执行失败,这里先要明白两个观点: 1.编译期异常错误,例如java中的编译期错误,我们使用的IDE工具会给你指出错误(说明代码有问题);在Redis的事务中,出现编译期错误(命令行有问题),事务中的所有命令都不会执行! 2.运行时异常错误,例如:1/0;这种错误只会在你执行代码后发现错误; 在Redis的事务中,如果事务队列中的命令存在语法性错误,其他命令是可以正常执行的!(又进一步说明了,Redis的事务不存在原子性!)

    编译期异常:

    运行时异常:

    Redis中的监控(watch)

    乐观锁:很乐观,觉得什么时候都不会出现错误,所以一般不会去上锁!

    例如:Mybatis-plus框架中的乐观锁插件,两个线程同时间去修改一个公共的数据,在更新数据的时候,我们使用乐观锁插件去判断一下,是否在此期间有人修改过这个数据: 1.获取Version 2.更新时比较Version

    Redis监控测试

    正常执行成功:

    执行失败:

    这里就和Mybatis-plus中的乐观锁机制一样,底层会去判断是否有人操作过监控的这个kv,如果发现操作过,那么事务执行失败。

    Processed: 0.011, SQL: 9