面试题答案
一键面试常见错误场景
- 被监控的键在事务执行前被修改:当使用
WATCH
监控了某些键后,在执行MULTI
开启事务到执行EXEC
提交事务期间,如果被监控的键值发生了变化,那么EXEC
会返回nil
,表示事务执行失败。这是因为WATCH
机制通过对比键的版本号(内部实现机制)来判断键是否被修改,若被修改则事务不执行。 - 语法错误:在使用
WATCH
命令时,如果命令格式不正确,例如参数个数不对,Redis 会返回错误信息,提示命令使用有误。比如WATCH key1 key2
是正确格式,若写成WATCH key1,key2
(错误分隔符)则会报错。 - 事务内命令错误:即使使用了
WATCH
,如果事务内的命令本身存在语法错误或类型错误等,在执行EXEC
时也会导致事务执行失败。例如在事务内对一个字符串类型的键执行SADD
(集合添加元素命令,要求键为集合类型)命令,Redis 会返回错误,并且整个事务不会执行。
Redis 自身默认的错误处理方式
- 被监控键修改导致的错误:当检测到被监控的键值变化时,
EXEC
命令返回nil
,通知客户端事务执行失败,事务中的所有命令都不会被执行。客户端需要根据返回值决定是否重新发起事务,通常需要重新获取数据、重新监控并执行事务。 - 语法错误:如果
WATCH
命令本身语法错误,Redis 会立即返回错误信息给客户端,提示命令使用不当,客户端需要修正命令后重新发送。 - 事务内命令错误:对于事务内命令的错误,Redis 在执行
EXEC
时发现错误,会直接返回错误信息给客户端,并且不会执行事务中的任何命令。这保证了事务的原子性,要么全部执行成功,要么全部不执行。