Redis事务
Redis事务通过队列存储需要的操作,然后一次性执行完毕,不允许被打断。(但是允许出错,这点与大部分数据库不同)
Redis事务基本操作
- 开启事务 指令:
multi
作用:设定事务的开启为止,此指令执行后,后续的所有指令均加入到事务中 - 执行事务 指令:
exec
作用:设定事务的结束位置,同时执行事务。与multi成对出现,成对使用 - 取消事务 指令:
discard
作用:终止当前事务,发生在multi之后,exec之前
?:加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行
事务的注意事项
- 定义事务过程中,命令格式输入错误语法错误:指令书写格式有误 **处理结果:**如果定义的事务所包含的命令存在语法错误,整体事务中所有命令均不会执行,包括语法正确的命令
- 定义事务的过程中,命令执行出现错误**运行错误:**命令格式正确,但是无法正确的执行。**处理结果:**能够正确运行的命令会执行,运行错误的命令不会被执行(这点与MySQL有所不同,Redis保证整体执行不会被打断,类似于锁的情况)
“Redis执行完的命令不会自动回滚,需要程序员自己的问题。这个问题不应该出现在线上环境中!出现了就是程序员业务代码的问题。
手动进行事务回滚
- 记录操作过程中被影响的数据之前的状态
- 单数据:string
- 多数据:hash、list、set、zset
- 设置指令恢复所有被修改的项
- 单数据:直接set
- 多数据:修改对应值或整体克隆复制
Redis中的锁
Redis中的锁用于完成事务之间的互斥性
Redis锁的相关操作
对key添加监视锁,在执行exec之前如果key发生了变化,终止事务执行。如果多个获取监视锁的只有第一个能执行(让别人不能用)
watch key1 [key2...]
取消对所有key的监视
unwatch
设置公共锁(如果获取失败则阻塞,通过将key del来删除锁)
setnx lock-key value
# 可以使用expire为锁添加时间限定,到时不释放放弃锁
expire lock-key second
pexpire lock-key milliseconds