redis事务

说起事务,小伙伴一定会想到传统关系型数据库的事务(要么都成功,要么都失败),redis的事务有些许的不同,我们一起看看

  • 是什么:
    可以一次执行多个命令,本质是一组命令的集合。一个事物中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入,不许加塞
  • 能干什么:
    一个队列中,一次性,顺序性,排他性的执行一系列指令。
    说人话:开启事务之后,将所有的指令按照顺序存起来,提交的时候一次执行这些指令。

事务常用命令

  • multi :标记一个事务块的开始
  • discard :取消事务,放弃执行事务块内的所有命令
  • exec:执行事务块内命令
  • watch:监视一个key或多个key,如果在事务执行之前这些个key被其他命令所改动,那么事务将被打断
  • unwatch:取消watch命令对key的监视

事务初体验

  • 正常执行(multi exec)
    redis事务基础使用

  • 放弃事务(multi discard)
    redis事务基础使用
    以上和传统关系型数据库的事务是有点像的,要么提交,全部命令执行,要么放弃事务,所有命令不提交

  • 全体连坐 (开启事物之后,如果其中有 命令 出错,那么都不会成功)
    redis事务基础使用

    • 冤头债主
      所有的指令语法格式全部正确,那就意味着全部加到了queue中,那么其中的incr k1 因为k1不是数字所以执行到这条指令的时候报错,那么就只有这一条指令失败,其他指令成功执行。有异于关系型数据库的事物
      redis事务基础使用

watch监控(类似乐观锁)

在multi开启事物之前,将要修改的数据监控上,然后multi,操作数据。如果在事物的过程中没有别的线程操作这个监控的数据,那么exec提交事物的时候是成功的,如果有线程操作了监控的数据,那么exec提交事物就会返回空 失败!(类似乐观锁机制,在提交的时候检查该数据是否被别人动过,如果动过返回失败。)
这里2018-12-07号具体应用的时候小测了一下:
当监控的key自己到时间删除的,提交事务的时候可以提交成功
当监控的key是自己删除的,那么提交事务的时候不能提交成功

spring boot中使用

使用场景是使用 Spring Data Redis 操作redis

Spring Data Redis 是对JRedis的客服端进行很好的封装, Spring Data Redis的RedisTemplate提供了MULTI、EXEC命令进行封装,但RedisTemplate先执行调用MULTI方法,然后在执行其它的命令,最后执行EXEC方法时,会出现报错:Caused by:Redis.clents.jedis.exceptions.JedisDataException:ERR EXEC without MULTI 问题
解决办法为:
redis事务基础使用

题后话,由于作者水平有限,文章中难免会有歧义的地方,欢迎大家批评指正,作者定会及时改正

相关文章: