Redis事务
Redis事务
什么是事务?
Redis 事务可以一次执行多个命令, 本质是一组指令集,是一个单独的隔离操作,事务中的所有命令都会按顺序地串行化执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务:Multi。
- 命令入队:操作命令。
- 执行/撤销事务:Exec/discard。
Redis和MySQL对比
事务的错误处理:
如果在入队列阶段出现语法错误
- 所有命令都不会执行
如果在执行阶段出现错误
- 只有报错的命令不会执行,其他命令都会执行,不会回滚
Redis锁机制
悲观锁:只有一个线程能操作数据,操作是给数据加锁
乐观锁:对数据不加锁,通过版本号或者时间戳实现
WATCH
在执行multi直线,限制性watch key,可以监视一个或多个key,如果在事务执行之前,这个key被其他命令改动,则停止执行事务。
Redis事务三特性
单独的隔离操作
- 事务中的所有命令都会序列化执行,事务执行过程中不会被其他事务打断
没有隔离的概念
- 队列中的命令在事务提交之前都不会被执行。
不保证原子性
- 在执行阶段,事务中如果有一条命令执行失败,其他命令仍然会被执行。
Redis中的LUA脚本(Redis>2.6)
LUA脚本类似redis事务,具有一定的原子性,不被其他命令插队,可以完成一些事务性操作。
利用lua脚本解决争抢问题,实际上就是redis利用其单线程的特性,用任务队列的方式解决了多并发问题。