Redis事务Multi介绍

183 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Redis事务 Redis的事务是通过multi、exec、discard和watch这四个命令来完成的。

Redis的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合。

Redis将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行

Redis不支持回滚操作

事务命令 multi:用于标记事务块的开始,Redis会将后续的命令逐个放入队列中,然后使用exec原子化地执行这个命令队列

exec:执行命令队列

discard:清除命令队列

watch:监视key

unwatch:清除监视key

127.0.0.1:6379> multi OK 127.0.0.1:6379> set s1 222 QUEUED 127.0.0.1:6379> hset set1 name zhangfei QUEUED 127.0.0.1:6379> exec

  1. OK
  2. (integer) 1 127.0.0.1:6379> multi OK 127.0.0.1:6379> set s2 333 QUEUED 127.0.0.1:6379> hset set2 age 23 QUEUED 127.0.0.1:6379> discard OK 127.0.0.1:6379> exec (error) ERR EXEC without MULTI 127.0.0.1:6379> watch s1 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> set s1 555 QUEUED 127.0.0.1:6379> exec # 此时在没有exec之前,通过另一个命令窗口对监控的s1字段进行 修改 (nil) 127.0.0.1:6379> get s1 222 127.0.0.1:6379> unwatch OK watch命令 总结: 1.开启MULTI事务 存储各个命令 输入exec 则执行存储的命令 在没输入exec时输入discard 则中断事务. 2.开启MULTI事务之前输入wacth命令,如果中途有其他线程修改了wacth key中所在的value值,则此项事务会提交失败,这就是用wacth做的乐观锁. Redis的弱事务性 1.如果开启MULTI事务,你一旦有一条命令出现语法错误,redisClient将flags置为REDIS_DIRTY_EXEC,EXEC命令将会失败返回。 2.在事务中,如果你输入两条冲突语句 比如1. set m1 55 2.lpush m1 1 2 3 然后exec 结果是第一条执行成功第二条失败,所以事务并不能实现事务的原子性,要么全成功,要么全失败. 3.不支持回滚-------1、大多数事务失败是因为语法错误或者类型错误,这两种错误,在开发阶段都是可以预见的 2、Redis为了性能方面就忽略了事务回滚。 (回滚记录历史版本)