51 lines
1.4 KiB
Lua
51 lines
1.4 KiB
Lua
-- 购物车操作Lua脚本
|
||
-- 功能:原子性地更新购物车并检查库存
|
||
-- 参数:KEYS[1] = 购物车key, KEYS[2] = 库存key, ARGV[1] = 商品ID, ARGV[2] = 数量, ARGV[3] = 操作类型(add/update/remove)
|
||
-- 返回值:成功返回新数量,失败返回负数
|
||
|
||
local cart_key = KEYS[1]
|
||
local stock_key = KEYS[2]
|
||
local product_id = ARGV[1]
|
||
local quantity = tonumber(ARGV[2])
|
||
local operation = ARGV[3]
|
||
|
||
-- 获取当前库存
|
||
local current_stock = redis.call('GET', stock_key)
|
||
if current_stock == false then
|
||
return -1 -- 商品不存在
|
||
end
|
||
current_stock = tonumber(current_stock)
|
||
|
||
-- 获取购物车中当前商品数量
|
||
local cart_quantity = redis.call('HGET', cart_key, product_id)
|
||
cart_quantity = cart_quantity and tonumber(cart_quantity) or 0
|
||
|
||
local new_quantity = 0
|
||
|
||
if operation == 'add' then
|
||
new_quantity = cart_quantity + quantity
|
||
elseif operation == 'update' then
|
||
new_quantity = quantity
|
||
elseif operation == 'remove' then
|
||
redis.call('HDEL', cart_key, product_id)
|
||
return 0
|
||
else
|
||
return -2 -- 无效操作
|
||
end
|
||
|
||
-- 检查库存是否足够
|
||
if new_quantity > current_stock then
|
||
return -3 -- 库存不足
|
||
end
|
||
|
||
-- 更新购物车
|
||
if new_quantity > 0 then
|
||
redis.call('HSET', cart_key, product_id, new_quantity)
|
||
-- 设置购物车过期时间(7天)
|
||
redis.call('EXPIRE', cart_key, 7 * 24 * 3600)
|
||
else
|
||
redis.call('HDEL', cart_key, product_id)
|
||
end
|
||
|
||
return new_quantity
|