Lua脚本编程:Redis的原子操作利器
为什么需要Lua脚本? 问题:多个Redis命令无法保证原子性 // ❌ 非原子操作(有并发问题) Long stock = redis.get("stock"); if (stock > 0) { redis.decr("stock"); // 可能有多个线程同时执行 return "success"; } Lua脚本优势: ✅ 原子性:脚本执行期间不会插入其他命令 ✅ 减少网络往返:多个命令一次发送 ✅ 复用:脚本可以缓存在服务器 基础语法 执行脚本 # EVAL命令 redis> EVAL "return redis.call('SET', 'key', 'value')" 0 OK # 格式:EVAL script numkeys key [key ...] arg [arg ...] # numkeys: key的数量 # KEYS[1], KEYS[2]: 传入的key # ARGV[1], ARGV[2]: 传入的参数 调用Redis命令 -- redis.call():命令错误会报错 redis.call('SET', 'key', 'value') -- redis.pcall():命令错误会返回错误对象 redis.pcall('SET', 'key', 'value') 实战案例 案例1:库存扣减(秒杀场景) -- stock_deduct.lua local key = KEYS[1] local quantity = tonumber(ARGV[1]) local stock = tonumber(redis.call('GET', key) or '0') if stock >= quantity then redis.call('DECRBY', key, quantity) return 1 -- 成功 else return 0 -- 库存不足 end Java调用: ...