Redis 事务高频面试题及详细答案(实战向)_第1页
Redis 事务高频面试题及详细答案(实战向)_第2页
Redis 事务高频面试题及详细答案(实战向)_第3页
Redis 事务高频面试题及详细答案(实战向)_第4页
Redis 事务高频面试题及详细答案(实战向)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Redis事务高频面试题及详细答案(实战向)一、基础认知类(初级面试必问)1、Redis事务是什么?核心作用是什么?参考答案:Redis事务是一组命令的批量执行机制,能够将多个命令打包,一次性、顺序性地执行,执行过程中不会被其他客户端的命令插队打断。它的核心作用主要两点:1.保证多个命令连续执行,杜绝并发场景下的命令穿插问题,解决简单的并发竞争问题;2.事务内所有命令要么全部执行,要么全部不执行(语法错误场景),保证批量操作的整体性。注意:Redis事务不支持关系型数据库的回滚机制,仅支持失败终止执行。2、Redis事务的核心命令有哪些?各自作用?参考答案:一共四个核心命令,是事务的完整执行流程:1.MULTI:开启事务,执行后客户端进入事务状态,后续输入的命令不会立即执行,会全部放入事务命令队列中;2.EXEC:提交事务,一次性执行队列中所有缓存的命令,执行完毕后退出事务状态;3.DISCARD:放弃事务,清空事务命令队列,直接退出事务状态,所有缓存命令都不会执行;4.WATCH:乐观锁监控命令,监控指定key,若事务提交前key被其他客户端修改,当前事务直接作废,所有命令不执行。3、简单说下Redis事务的执行流程?参考答案:整体分为三个阶段,流程固定:1.开启事务:执行MULTI命令,切换事务模式;2.命令入队:后续所有读写命令,都会被缓存到事务队列,不立即执行,服务端仅返回QUEUED响应;3.执行/放弃事务:收到EXEC则批量执行所有队列命令,返回执行结果;收到DISCARD则清空队列,放弃事务。二、核心特性与原理类(中级高频)4、Redis事务支持原子性吗?和MySQL事务原子性有什么区别?参考答案:这是面试高频坑点,核心结论:Redis事务仅满足部分原子性,不支持完整原子性。1.MySQL事务原子性是严格的:要么全部成功,要么失败全部回滚;2.Redis事务分两种错误场景:-语法错误、参数错误(入队前就能检测的错误):整个事务直接作废,所有命令不执行,具备原子性;-运行时错误(命令语法没问题,执行时报错,比如给字符串做列表操作):错误命令执行失败,前后的正确命令依然正常执行,没有回滚,不具备原子性。总结:Redis事务没有回滚机制,只能保证命令批量执行不被打断,无法保证执行失败后数据回退。5、Redis事务支持隔离性、持久性、一致性吗?参考答案:结合Redis单机特性,逐一说明:1.隔离性:完全支持。事务开启后,队列中的命令不会被其他客户端命令穿插,EXEC执行阶段是单线程串行执行,全局独占,不会出现并发干扰;2.一致性:基本保证。无语法错误时命令全部执行,语法错误全部不执行;运行时错误仅局部失败,数据不会出现崩溃、错乱,仅存在数据不一致的业务问题;3.持久性:不保证。事务执行完毕后,数据写入内存,是否持久化取决于Redis持久化配置(RDB/AOF),事务本身不具备落地持久化的能力,宕机可能丢失未落地数据。6、WATCH命令的原理是什么?如何实现乐观锁?参考答案:WATCH是Redis实现事务乐观锁的核心,解决并发修改导致的数据覆盖问题。1.原理:客户端执行WATCHkey后,服务端会记录当前key的版本状态(修改标记);2.校验机制:在客户端执行EXEC提交事务的瞬间,Redis会校验被WATCH的所有key;3.分支逻辑:-若key没有被其他客户端修改:正常执行事务所有命令;-若key已被其他客户端修改:直接放弃本次事务,所有队列命令不执行,返回nil;4.解锁机制:EXEC、DISCARD执行后,会自动释放所有WATCH监控的key,无需手动解锁。适用场景:高并发、低冲突的场景,比如库存扣减、积分修改,替代悲观锁提升性能。7、Redis事务为什么不支持回滚?参考答案:官方设计初衷就是舍弃回滚,核心三个原因:1.追求高性能:回滚机制需要记录大量事务日志、数据快照,会极大增加内存开销和执行耗时,违背Redis高性能、轻量级的定位;2.错误场景可控:Redis的运行时错误基本都是编程逻辑问题(命令用错、数据类型不匹配),不属于运行时异常,这类问题完全可以在开发阶段通过代码校验规避,不需要事务回滚兜底;3.简化设计:无回滚机制让事务逻辑更简单,减少底层代码复杂度,降低故障概率。三、踩坑与实战问题(中高级面试)8、Redis事务中,一条命令失败,其他命令还会执行吗?举例说明参考答案:分两种场景,结果完全不同:1.入队失败(语法错误):比如命令拼写错误、参数个数不对。Redis会直接标记事务失败,后续所有命令都不执行,整体作废。示例:MULTI后输入set,缺少key和value,入队失败,EXEC后整个事务不执行。2.执行失败(运行时错误):命令语法正确,但是操作非法。错误命令终止,前后合法命令正常执行,无回滚。示例:MULTIseta1(合法)lpusha2(非法,a是字符串,无法执行列表操作)setb2(合法)EXEC执行结果:seta1、setb2成功执行,lpush报错,数据不会回滚。9、WATCH命令存在什么坑?如何解决?参考答案:核心坑点:WATCH的校验仅在EXEC瞬间执行一次,且事务执行过程中无法再次校验,同时存在重复竞争失败的问题。1.坑1:WATCH之后、MULTI之前的key修改也会被监控,若期间key变动,事务同样失效;2.坑2:高并发下大量事务竞争同一个key,会导致大量事务频繁失效重试,极端情况下出现活锁;3.坑3:WATCH全局生效,执行EXEC/DISCARD前,所有后续事务都会携带该监控,容易引发非预期失效。解决方案:1.事务执行完毕后主动执行UNWATCH释放监控key;2.业务层增加重试机制,事务失效后自动重试2-3次;3.超高并发场景放弃事务+WATCH,使用Redis原子命令(INCR、DECR)或Lua脚本替代。10、Redis事务和Lua脚本哪个更好?实际业务怎么选型?参考答案:两者都能实现批量原子操作,Lua脚本是更优的高阶方案,选型规则如下:1.事务(MULTI/EXEC)优缺点优点:语法简单、上手快,适合简单的多命令批量操作;缺点:无完整原子性、不支持逻辑判断、依赖WATCH做并发控制、失败无回滚。2.Lua脚本优缺点优点:完全原子执行,脚本内命令要么全部成功,要么全部失败;支持if/else、循环等复杂逻辑;一次性提交,网络开销更低;缺点:编写复杂度更高,过长脚本会阻塞Redis主线程。业务选型:-简单批量操作、无复杂逻辑、低并发:用原生事务;-高并发、需要原子一致性、有业务判断逻辑(库存、秒杀、分布式锁):优先Lua脚本。11、Redis事务能解决超卖问题吗?为什么?参考答案:单纯MULTI/EXEC事务无法解决超卖,必须配合WATCH乐观锁才能解决。1.仅用事务:多个客户端同时读取库存为1,同时进入事务扣减,事务批量执行后会出现库存负数,直接超卖;2.事务+WATCH:监控库存key,当第一个客户端扣减成功后,库存key被修改,其他客户端的事务提交时会检测到key变动,事务直接作废,避免并发扣减导致的超卖;3.弊端:高并发下重试次数多,性能一般,生产环境秒杀超卖更推荐Lua脚本或原子DECR命令。四、进阶原理与对比(高阶面试)12、Redis事务执行期间,其他客户端的命令会被阻塞吗?参考答案:分两个阶段,不会全程阻塞:1.命令入队阶段(MULTI到EXEC之间):不会阻塞,其他客户端可以正常读写数据,当前客户端仅缓存命令,不占用执行资源;2.EXEC执行阶段:会短暂阻塞。Redis是单线程模型,执行事务队列命令时,会串行执行所有命令,期间不会处理其他客户端的请求,执行完毕后释放线程。所以事务尽量不要包含过多耗时命令,否则会阻塞整个Redis服务。13、Redis集群模式下,事务还能用吗?有什么问题?参考答案:1.同一槽位的key:集群下可以正常使用事务,所有key落在同一个hashslot,由同一节点处理,事务生效;2.跨槽位/跨节点key:事务完全失效,不支持跨节点事务。因为Redis集群是分片架构,不同key分布在不同主节点,无法统一入队、统一校验执行,原生事务无法保证跨节点的原子性和一致性。集群多key原子操作解决方案:1.利用hashtag强制多个key落到同一个槽位;2.使用Lua脚本绑定单节点执行;3.放弃事务,用分布式锁兜底。14、谈谈Redis事务的优缺点和生产使用规范?参考答案:优点:1.保证批量命令串行执行,避免并发穿插问题;2.配合WATCH可实现轻量级乐观锁,解决简单并发竞争问题;3.无额外日志开销,性能远优于数据库事务。缺点:1.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论