首页/数据/数据库速查/EVAL 服务端脚本(原子复合操作)
本包目录(495 条)
MySQL 基础与连接36 条SQL 语法52 条用户与权限21 条备份与恢复56 条主从复制与高可用53 条性能与调优57 条Redis 命令96 条
Redis 运维与场景124 条

EVAL 服务端脚本(原子复合操作)

EVAL 把 Lua 脚本发送到服务端原子执行:读-判断-写 一步完成,不需要 WATCH 重试;库存扣减、限流、锁释放都靠它。脚本内只用 KEYS/ARGV,别写慢逻辑。

数据库速查数据更新于 2026-10-12

秒杀扣库存

秒杀扣库存
-- KEYS[1]=库存 key;返回剩余库存,-1 表示无货
local stock = tonumber(redis.call('GET', KEYS[1]) or '-1')
if stock <= 0 then return -1 end
redis.call('DECR', KEYS[1])
return stock - 1

调用

调用
EVAL "local s = tonumber(redis.call('GET', KEYS[1]) or '-1'); if s <= 0 then return -1 end; redis.call('DECR', KEYS[1]); return s - 1" 1 stock:1001
原子性整个脚本作为一个命令执行,不被其他命令插入
参数传递key 放 KEYS、值放 ARGV;不要在脚本文本里拼接
Cluster脚本涉及的所有 key 必须在同一槽(用 hash tag)
脚本运行期间阻塞整个实例:只写 O(1)/O(logN) 级逻辑;大集合遍历/全量 SCAN 千万别放进来。

易错点

  • 脚本里出现 KEYS 外的未声明 key:Cluster 下报跨槽错误
  • 脚本内写死业务键名:多环境/多租户下无法复用且容易串数据

数据来源与参考

  • Redis 官方文档: EVAL
  • Redis 官方文档: Lua scripting

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌