Redis 事务
一次操作执行多条命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入、不许加塞。由于redis只能在执行前检查一组命令的语法错误,在命令执行时出现异常没法全体回滚,所以是弱一致性。
multi + exec组合
正常执行
执行前队列中命令无语法错误,且执行成功
全部回滚
执行前队列中的命令检查出语法错误,整个事务的命令都会放弃执行
部分执行失败
执行前队列中的命令语法检查通过,执行时发生异常,则只有执行异常的命令会执行失败,其它命令正常执行
multi + discard组合
主动放弃执行事务中的组合命令
watch + multi + exec组合
执行事务组合命令前先通过watch获取锁资源,watch采用乐观锁的形式,不会造成进程阻塞,当变更数据时数据发生变化,则事务执行失败。
示例中在执行multi前通过其它客户端改变了transtion:name的值,导致最终事务执行失败
unwatch
通过unwatch可以取消乐观锁资源的监听
示例中,在watch后通过其它客户端改变了transtion:name的值,之后通过unwatch取消了乐观锁的监听,所以事务可以成功执行。
Redis 管道
可以一次性的发送多条命令给服务端,服务端一次处理完成后,通过一条响应一次性将结果返回,减少客户端与redis的通信次数来实现降低往返的延迟时间。pipeline实现的原理是队列,先进先出特性就保证数据的顺序性。
如果管道中的任何命令执行失败,则所有后续命令都会被取消。