分布式缓存(redis)0.面试技能小知识

Redis - 深入理解Redis事务

2019-10-21  本文已影响0人  齐晋

目录

Redis是如何实现事务的?

解读
事务要满足ACID四个原则。了解Redis实现事务的机制,就能了解Redis是如何分别保证ACID的。同时,了解了事务实现机制,也能清楚知道Redis事务有何优劣,在使用时如何避免Redis事务缺点。

参考

概要

  1. Redis通过四个命令实现事务: WATCH, MULTI, EXEC, DISCARD
  2. Redis事务以MULTI命令开始,EXEC/DISCARD命令结束。EXEC用于提交事务,DISCARD用于取消事务。
  3. 在开启事务时,Redis操作命令并不会立即执行,而是会先进入事务队列。Redis事务队列是一个FIFO队列
  4. 当执行EXEC命令时,会把事务队列中的命令逐个执行,不会被任何命令中断。
事务中执行的命令出现错误,会回滚事务吗?

解读
通常,一个事务中会有不止一个Redis操作,任何一个操作都有失败的可能。在有操作出错的情况下,会影响事务的执行吗?

参考

概要

  1. 首先,Redis事务时不支持回滚的。也就是说,如果事务中的命令执行出错,已经执行的命令不会撤回,后续的命令也会继续执行。
  2. Redis事务的命令分为入队和执行两个阶段。在入队(进入事务队列)时出错,Redis会忽略入队出错的命令,不会影响后续命令入队。执行时出错,出错命令会被Redis忽略,其他没有出错的命令均会执行。
同一个连接可以重复开启事务吗?

解读
本质问题是是否允许事务嵌套。

参考

概要

  1. Redis事务不能嵌套。如果再收到MULTI命令开启事务,会返回错误(redis-cli会返回(error) ERR MULTI calls can not be nested这样的错误)
  2. 遇到嵌套事务返回错误后,并不会影响事务队列继续接收命令,也不会修改事务队列中的任何数据。
多个客户端同时开启事务会怎样?

解读
在并发情况,很容易出现多个客户端同时开启事务的情况。这时Redis会区分客户端维护事务队列吗?另外,实际工程中为了提升性能,通常会用Redis连接池复用连接,这种情况下,会出现连接复用导致事务嵌套吗?

参考

概要

  1. Redis事务队列是与连接绑定的,不同的连接中允许同时开启事务,不会相互影响
  2. 合理的事务管理器中,会在开启事务时绑定连接,防止连接被其他请求复用。不过应用不当,会出现连接不能被归还的问题。(由此可见,一个优秀的事务管理器是多么重要)
使用Redis事务只用MULTIEXEC吗?

解读
使用Redis事务,不能单纯只用MULTIEXEC,因为某些key在事务执行时已经变了。正确的Redis事务需要保证事务执行时,事务涉及的数据没有被修改。

参考

概要

  1. 在开启事务前,使用WATCH命令监视指定的key,形成乐观锁
  2. 事务执行时,如果被WATCH的key发生了变化,则事务失效,不能执行。
Redis中的WATCH机制是怎么实现的?

解读
无他,只是为了了解底层实现原理

参考

概要

  1. 每个被WATCH的key都会维护一个WATCH这个key的所有client列表
  2. 当被WATCH的key发生修改时(执行任意修改命令),所有WATCH该key的client的REDIS_DIRTY_CAS字段会被修改为打开状态。
  3. 当执行事务时,如果这个client的REDIS_DIRTY_CAS字段被打开,说明有至少一个数据被修改,事务不能执行。

参考
Redis官方文档-Transactions

上一篇下一篇

猜你喜欢

热点阅读