Redis的数据应用及扩展之事务

426 阅读2分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

事务

  • 在我们日常工作中,遇到的很多场景都需要介入事务去解决
    • 如日常的转账,购买商品,退款等等一系列的操作
    • 我们来看redis中的事务
    • 我们是存储了a == 1,让a`自增两次,最后将事务执行

image.png

  • 具体过程
    • 首先当我们没执行exec的时候,我们上面的操作都是在redis缓存的一个事务队列中,

    • 当我们执行每次命令的时候,QUEUED就代表进入了队列中

    • 当执行exec才代表真正的执行了这条事务

模拟一次事务失败的过程

  • 首先我们MULTI表示是一个事务
    • a置位1,然后将a自增加一,再将b置为字符串test

    • b自增,这时是错误的,因为字符串是无法自增的

    • 此时再将a自增加一,最后执行exec是报错的

    当所有的命令进入队列中的时候,如果有错误其实是不会回滚的,当get a的时候 a的值仍然是自增后的结果为3

image.png

乐观锁-watch

  • 当我们的业务是对数据更改的复杂,那么我们只能在逻辑业务中进行更改
    • 所以redis提供了watch,会在MULTI之前使用watch盯紧变量,
    • 如果在watch一个变量以后,再对这个变量进行修改那么就会报错(执行事务以后返回的是nil)
    • 如下图所示

image.png

  • 在我们实际业务中,事务一般都放在代码中去维护
    • 如使用springboot的注解去实现事务,而如果维护在redis中是不太稳妥的
    • 因为在代码中我们可以清晰的将事务与业务场景融合,所以在做原子类的业务的时候,尽量都交给框架和逻辑代码去搞定

总结 redis 是支持事务的,但是事务中是没有回滚功能的,每次的命令都放到了队列中🦄