核心问题
- Redis执行lua脚本是否能确保原子性?
面试经历
- 面试者在面试中自信回答Redis执行lua脚本能保证原子性,但未能深入解释原因。
原子性概念
- 原子性:一个事务的所有命令要么全部执行成功,要么全部执行失败。
Redis官方说明
- Redis在执行lua脚本期间,会阻塞所有客户端操作,确保不会有其他命令插入执行。
- 官方定义中并未明确包含原子性。
实验验证
- 编写并执行一个简单的lua脚本,包括对变量a的赋值和对字符串b的加法运算。
- 预设Redis中key a的值为1。
- 执行lua脚本,脚本中对b进行加法运算时出现异常。
- 检查a的值,发现已更新为2,说明没有执行回滚操作。
结论
- Redis执行lua脚本不能保证原子性。
- lua脚本能保证在执行期间不会有其他客户端命令干扰,但不支持回滚。
Redis事务与lua脚本的比较
-
Redis事务:
- 客户端发送MULTI命令后,每个命令请求被记录到事务队列。
- 执行EXEC命令时,按顺序执行事务队列中的命令。
- 每个命令都需要与Redis服务端进行交互,涉及多次网络IO操作。
-
lua脚本: