redis事务基础使用

redis事务

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

  • 是什么:
    可以一次执行多个命令,本质是一组命令的集合。一个事物中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入,不许加塞
  • 能干什么:
    一个队列中,一次性,顺序性,排他性的执行一系列指令。
    说人话:开启事务之后,将所有的指令按照顺序存起来,提交的时候一次执行这些指令。
事务常用命令
  • multi :标记一个事务块的开始
  • discard :取消事务,放弃执行事务块内的所有命令
  • exec:执行事务块内命令
  • watch:监视一个key或多个key,如果在事务执行之前这些个key被其他命令所改动,那么事务将被打断
  • unwatch:取消watch命令对key的监视
事务初体验
  • 正常执行(multi exec)
    正常执行

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

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

    • 冤头债主
      所有的指令语法格式全部正确,那就意味着全部加到了queue中,那么其中的incr k1 因为k1不是数字所以执行到这条指令的时候报错,那么就只有这一条指令失败,其他指令成功执行。有异于关系型数据库的事物
      冤头债主
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 问题
解决办法为:
事务解决

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值