秒杀扣库存
秒杀扣库存
-- 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 千万别放进来。