面试题答案
一键面试关键技术点
- WATCH 命令:在开启事务前,使用
WATCH
命令监控一个或多个键。这样在事务执行前,如果被监控的键发生变化,事务将被打断,不会执行,以此保证事务执行时数据的一致性。 - 乐观锁机制:
WATCH
命令本质上是一种乐观锁。乐观锁假设在大多数情况下,数据在事务执行期间不会被其他客户端修改,只有在实际执行事务时才检查数据是否被修改。 - 回滚与重试:当事务因为数据变化而执行失败时,需要有回滚操作将数据恢复到事务开始前的状态,并进行重试。
- 错误处理:需要对事务执行过程中的各种错误(如网络错误、数据类型错误等)进行恰当处理,确保事务的原子性和一致性。
设计思路
- 开启事务前:客户端在执行事务前,通过
WATCH
命令监控相关键。例如,如果事务涉及对key1
和key2
的操作,就使用WATCH key1 key2
。 - 事务操作:接着使用
MULTI
开启事务,然后将一系列的 Redis 命令入队,如SET key1 value1
,INCR key2
等。 - 执行事务:使用
EXEC
尝试执行事务。如果在WATCH
之后,EXEC
之前,被监控的键发生了变化,EXEC
将返回nil
,表示事务执行失败。 - 补偿处理:当事务执行失败时,进行回滚操作,例如如果事务中有
INCR
操作,就需要有对应的DECR
操作将数据恢复。然后重新执行WATCH
、MULTI
和EXEC
操作,直到事务成功执行。 - 错误处理:在事务执行过程中,如果出现其他错误,如网络异常导致命令无法发送或接收响应,需要根据具体情况进行处理,比如重试操作或者记录错误日志并向上层应用汇报。