面试题答案
一键面试- 实现思路:
- 在Lua脚本中使用Redis的
WATCH
机制来监控相关的键。WATCH
命令可以在事务开始之前,监控一个或多个键。如果在WATCH
之后,被监控的键被其他客户端修改,那么当前事务会被打断,不会执行。 - 使用Redis的事务(
MULTI
/EXEC
)包裹Lua脚本中的多个Redis操作。MULTI
用于标记事务的开始,EXEC
用于执行事务中的所有命令。 - 在Lua脚本中,通过返回特定的错误信息来指示EVALSHA命令执行过程中的错误。应用程序在接收到错误信息后,可以决定是否回滚事务。
- 在Lua脚本中使用Redis的
- 可能用到的Redis特性:
- WATCH命令:
- 语法:
WATCH key [key ...]
。 - 作用:在执行
MULTI
之前使用WATCH
监控键,保证在事务执行期间,被监控的键没有被其他客户端修改。例如,假设Lua脚本要操作键key1
和key2
,可以在脚本开头使用redis.call('WATCH', 'key1', 'key2')
。
- 语法:
- 事务(MULTI/EXEC):
- MULTI:语法为
MULTI
,用于标记事务的开始。一旦执行MULTI
,后续的Redis命令不会立即执行,而是被放入队列中。 - EXEC:语法为
EXEC
,用于执行事务队列中的所有命令。如果在WATCH
监控期间,被监控的键没有变化,EXEC
会成功执行事务中的所有命令;如果被监控的键发生变化,EXEC
会返回nil
,表示事务执行失败。在Lua脚本中,可以通过redis.call('MULTI')
开始事务,通过redis.call('EXEC')
执行事务。
- MULTI:语法为
- Lua脚本返回值:Lua脚本可以通过
return
语句返回错误信息。例如,如果在脚本执行过程中发现某个条件不满足,可以return {false, "自定义错误信息"}
。应用程序在接收到返回值后,判断第一个元素是否为false
,如果是则根据第二个元素的错误信息进行相应处理,比如回滚事务。 - UNWATCH:语法为
UNWATCH
,用于取消对所有键的监控。如果在事务执行完成后,不再需要监控这些键,可以调用redis.call('UNWATCH')
。这在Lua脚本执行完毕,释放资源方面有一定作用。
- WATCH命令: