0Pricing
Lua Academy · 课时

原子操作和事务

使用 Lua 脚本执行多步骤的原子 Redis 操作。

原子操作和事务 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

为什么需要原子多步操作?

许多 Redis 使用场景都需要在一次一致的操作中读取和写入多个键。如果没有原子性,竞态条件就会破坏状态。

读取-修改-写入竞态条件

不使用 Lua 时:GET 计数器 → 在客户端中修改 → SET 计数器。两个客户端可能读取到相同的值,分别进行修改,而后执行的 SET 会覆盖先执行的修改。

Lua 脚本修复方案

使用 Redis 中的 Lua 后,读取-修改-写入过程会在服务器内部以原子方式完成。

EVAL "
local val = redis.call('GET', KEYS[1])
val = tonumber(val) or 0
val = val + tonumber(ARGV[1])
redis.call('SET', KEYS[1], val)
return val
" 1 counter 5

比较并交换

以原子方式实现 CAS(比较并交换)——仅当当前值等于预期值时才更新。

EVAL "
local cur = redis.call('GET', KEYS[1])
if cur == ARGV[1] then
  redis.call('SET', KEYS[1], ARGV[2])
  return 1
end
return 0
" 1 mykey expected newvalue

分布式锁

以原子方式获取锁:SET 键 值 NX EX 秒数。这是安全模式,也就是对应的 Lua 实现。

EVAL "
if redis.call('SET', KEYS[1], ARGV[1], 'NX', 'EX', ARGV[2]) then
  return 1
end
return 0
" 1 lock:resource "owner-uuid" 30

安全地释放锁

只有锁的所有者才能释放锁。这样可以防止其他客户端释放不属于自己的锁。

EVAL "
if redis.call('GET', KEYS[1]) == ARGV[1] then
  return redis.call('DEL', KEYS[1])
end
return 0
" 1 lock:resource "owner-uuid"

多键事务

Lua 脚本可以以原子方式操作多个键,这是 MULTI/EXEC 无法保证的(它可能在中途失败,从而留下部分状态)。

MULTI/EXEC 与 Lua 的比较

MULTI/EXEC 会将命令排队后批量执行,但对于读取的值而言并不是真正的原子操作(使用监视和取消监视会增加复杂性)。Lua 脚本更简单,并且完全具有原子性。

在 Lua 中回滚

Redis Lua 不支持带回滚的事务。如果中途发生错误,之前执行的 redis.call 命令不会被撤销。请先检查前置条件,将脚本设计得足够安全。

脚本大小限制

脚本应当小巧且运行迅速。复杂逻辑应放在应用层,而不是 Redis 中。Lua 只应用于原子操作部分。

测试原子性

使用并发 Redis 客户端测试竞态条件。借助 Redis 基准测试工具,在高并发环境下验证 Lua 脚本是否能保持正确状态。

原子操作问题

为什么在 Redis Lua 脚本中执行读取-修改-写入,比在应用程序代码中执行更安全?

回顾:原子操作与事务

使用 Redis Lua 脚本实现原子读取-修改-写入、CAS 和分布式锁。对于依赖读取值的操作,Lua 脚本比 MULTI/EXEC 更简单且更可靠。保持脚本精简,并在并发环境下进行测试。

常见问题解答

「原子操作和事务」课时是免费的吗?

是的 — 「原子操作和事务」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「原子操作和事务」这节课中我会学到什么?

使用 Lua 脚本执行多步骤的原子 Redis 操作。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「原子操作和事务」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. EVAL 和 Redis Lua 环境
  2. 原子操作和事务
  3. 使用 Lua 实现速率限制
  4. SCRIPT LOAD 和 EVALSHA
← 返回 Lua Academy