什么是Redis事务?
Redis事务是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列),当执行时一次性的按照添加顺序依次执行,中间不会被打断或者干扰。
redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
事务的基本操作
开启事务:multi 设定事务的开启位置,此命令执行后,后续所有的指令均加入到事务中
执行事务:exec 设定事务的结束位置,同事执行事务,与multi指令成对使用
取消事务:discard 终止当前事务的定义,发生在multi之后,exec之前
注意:加入事务的命令暂时进入到任务队列,并没有立即执行,当执行exec指令时队列中的指令才开始执行
事务操作注意事项
1、如果在一个事务中的命令出现语法错误,那么所有的命令都不会执行
2、如果在一个事务中出现运行错误,那么正确的命令会被执行
3.redis不支持回滚,已经执行完毕的命令对应的数据不会自动回滚,需要程序员在代码中实现回滚,手动回滚参考方案如下:
记录操作过程中被影响的数据之前的状态
单数据:string
多数据:hash、list、set、zset
设置指令恢复所有的被修改的项
单数据:直接set(注意周边属性,例如时效)
多数据:修改对应值或整体克隆复制
事务锁
WATCH 命令是一个乐观锁,可以为 Redis 事务提供 check-and-set (CAS)行为。 可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令,watch命令必须在开始事务之前进行监控,不能在事务中监控某个key
对 key 添加监视锁,在执行exec前如果key发生了变化,终止事务执行 watch key1 [key2……]
取消对所有 key 的监视 unwatch
redis 应用基于状态控制的批量任务执行-watch监控某个状态或者数据