自学内容网 自学内容网

Redis--事务机制的详解及应用

Redis事务的概念:

Redis事务就是将一系列命令包装成一个队列,在执行时候按照添加的顺序依次执行,中间不会被打断或者干扰,在执行事务中,其他客户端提交的命令不可以插入到执行事务的队列中,简单来说Redis事务就是一次性、顺序性、排他性的执行一些列命令。

Redis事务的特点:

  • Redis事务不保证原子性,Redis中单个命令是原子性的,但是Redis事务不保证原子性,且不会回滚,当一组命令中有某个命令执行失败后,后续的命令会继续执行。
  • Redis事务单独的隔离操作,事务中的所有命令都会序列化、按顺序执行,在执行过程中,不会被其他的客户端发送的命令插入。
  • 没有隔离级别的概念,队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行,事务开始执行后,其他客户端的命令也无法插入。
  • Redis事务中命令格式错误不会执行,但是如果格式正确,但是运行错误(例如list进行incr操作),最终正常的命令会正常执行,发生错误的不执行,这个时候就要处理数据一致性的问题了。
    Redis事务的主要作用就是串联多个命令防止别的命令插队。

Redis事务常用命令:

命令描述
multi开启事务命令,后续命令依次进入队列
exec执行事务,如果被监听的key没有被修改,就执行事务,否则回滚
discard取消事务,发生在mulit之后exec之前,执行该命令后,不能再继续执行exec命令了
watch key1 [key2 …]用于监视一个或多个key,如果在事务执行之前,key被其他命令所改动,那么事务将被打断
unwatch key1 [key2 …]取消 WATCH 命令对所有 key 的监视

Redis事务的执行步骤:

  • 开启事务:mulit,执行此命令后,开启Redis事务,后续的所有指令都添加到事务中。
  • 命令入队:将所有的命令加入队列。
  • 执行事务:exec,执行此命令后,事务开始执行,Redis依次开始执行队列中的命令,其他命令不可插队或打断了。
  • exec,执行此命令后,事务开始执行,Redis依次开始执行队列中的命令,其他命令不可插队或打断了。

图例:
在这里插入图片描述

watch命令:

  • watch命令是一个乐观锁,他可以在执行事务之前监控Redis中任务数量的key,并在执行exec的时候,检查这些key是否被修改过,如果修改过,事务就会拒绝执行。
  • 用来判断事务执行是否安全,在执行multi命令之前,先执行watch key1 key2 …命令,对目标key进行监视,最后在执行exec命令事,Redis会检查这些key否打开了REDIS_DIRTY_CAS标识,如果打开,则事务可以正常执行,否则事务会拒绝执行。

unwatch的命令:
取消watch命令监视的key,如果再执行unwatch命令之前,已经执行了exec或者discard命令,那就无需执行unwatch命令了。

Redis事务的使用场景:

  • 用户命令打包,批量操作的场景,以此来减少Redis服务器的通讯次数。
  • 多个命令需要顺序操作的时候,因为Redis事务中的命令是顺序执行的。

总体来说Redis事务在实际业务中使用较少,且Redis事务不支持回滚,需要谨慎使用。

如有不正确的地方请各位指出纠正。


原文地址:https://blog.csdn.net/weixin_42118323/article/details/136370476

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!