redis事务

  • redis也是有事务的,类似mysql的mvcc那样的,也就是说在你开启事务到结束这个期间,别人对这个数据是做不了修改的

事务的基本操作

  • 开启事务:multi :设定事务的开启位置,这个指令执行后,后续的命令都加入到事务中
  • 执行事务:exec 设定事务的结束,同时执行事务,和multi成对出现
  • 加入事务的命令暂时进入了队列,没有立即执行,只有执行了exec命令才开始执行
  • 取消事务:discard:终止当前事务的定义,在multi之后,exec之前

事务的执行流程

redis之事务,锁

事务的注意事项

  • 如果在事务过程中,命令格式出入错误,则整体事务所有命令都不会执行,包括正确的指令
  • 如果是执行出现了错误,比如对list进行排序操作,能够正确执行的执行,不能执行的不执行
  • 已经执行完的命令无法自动回滚,只能在代码中回滚
    • 记录操作过程中被影响的数据之前的状态
    • 设置指令恢复所有被修改的项

redis 锁

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

分布式锁

  • 使用setnx设置一个公共锁 setnx lock-key value
    • 利用setnx命令返回值的特征,有值返回设置失败,无值返回设置成功
      • 对于返回设置成功的,拥有控制权,进行下一步
      • 对于返回失败的,不具有控制权,排队或等待
  • 改良:使用expire为锁key添加时间限定,到时不释放,放弃锁
    - expire lock-key second
    - pexpire lock-key milliseconds (毫秒)

相关文章: