Redis学习笔记(五):Redis事务-multi、exec、discard、锁、分布式锁、死锁

Redis学习笔记系列

  • Redis学习笔记(一):下载与安装-Windows、Linux
  • Redis学习笔记(二):数据类型和通用操作命令
  • Redis学习笔记(三):Java连接Redis(Jedis)以及示例代码
  • Redis学习笔记(四):Redis持久化
  • Redis学习笔记(五):Redis事务-multi、exec、discard、锁、分布式锁、死锁
  • Redis学习笔记(六):删除策略、逐出算法
  • Redis学习笔记(七):redis高级数据类型及应用场景-Bitmaps、HyperLogLog、GEO
  • Redis学习笔记(八):redis主从复制-建立连接、数据同步、命令传播、复制缓冲区、复制偏移量、心跳机制
  • Redis学习笔记(九):哨兵模式-监控、通知、故障转移
  • Redis学习笔记(十):Redis集群-结构设计、集群搭建、集群操作、主从下线、主从切换
  • Redis学习笔记(十一):企业级解决方案-缓存预热、缓存雪崩、缓存击穿、缓存穿透、性能指标监控

Redis事务简介

redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰,一个队列,一次性,顺序性,排他性的执行一系列命令

事务的基本操作

  • 开启事务 multi
    设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中
  • 执行事务 exec
    设定事务的结束位置,同时执行事务。与multi成对出现,成对使用
  • 取消事务 discard
    终止当前事务的定义,发生在multi之后,在exec之前

事务的工作流程

Redis学习笔记(五):Redis事务-multi、exec、discard、锁、分布式锁、死锁_第1张图片

事务的注意事项

  • 定义事务的过程中,命令格式输入错误
    如果定义的事务中所包含的命令存在语法错误,整体事务中所有命令均不会执行,包括那些正确的命令
  • 定义事务的过程中,命令执行出现错误
    正确运行的命令会执行,错误的命令不会被执行
  • 已经执行完毕的命令对应得到数据不会自动回滚,需要程序员自己在程序中实现回滚

Redis事务-锁

  • 对key添加监视锁,在执行exec前如果key发生了变化,终止事务执行 watch key1 [key2 ...]
  • 取消对所有key的监视 unwatch

应用场景

应用于基于状态控制的批量任务执行

Redis事务-分布式锁

setnx lock-key value
使用setnx设置一个公共锁,利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功;对于设置成功的,拥有控制权,进行下一步的具体业务操作;对于返回设置失败的,不具有控制权,排队或等待;操作完毕之后通过del操作释放锁

应用场景

应用于基于分布式锁对应的场景控制

Redis事务-死锁

  • 由于锁操作是由用户控制加锁解锁,必定会存在加锁后未解锁的风险
  • 需要解锁操作不能仅依赖用户控制,系统级别要给出对应的保底处理方案

解决方案

使用expire为锁key添加时间限定,到期不释放则放弃锁
expire lock-key second
pexpire lock-key milliseconds
锁时间设定推荐: 执行业务最大耗时*120% + 平均网络延迟 * 110%


- 捐赠 -


如果觉得还不错,请我喝杯水吧 ^ _ ^ 您的鼓励是我不断前进的动力,如果有错误的地方,欢迎提出批评改正意见,戳我,感谢您的支持

支付宝 微信

你可能感兴趣的:(Redis学习笔记系列)