xiangpei
2025-05-30 32affb9328997ab51b2c88f7f034c16a1e7ed6d0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
-- 可能回滚的列表,一个记录要回滚的skuid一个记录库存
local id_list= {}
local quantity_list= {}
 
-- 调用放传递的keys 和 values  execute(RedisScript<T> script, List<K> keys, Object... args)
local keys = KEYS
local values = ARGV;
 
local function deduction(key,num)
    keys[1] = key;
    local value = redis.call("get",keys[1])
    if not value then
        value = 0;
    end
    value = value + num
    -- 变更后库存数量小于
    if(value<0)
    then
        -- 发生超卖
        return false;
    end
    redis.call("set",keys[1],value)
 
    return true
end
 
local function rollback()
    for i,k in ipairs (id_list) do
        -- 还原库存
        keys[1] = k;
        redis.call("incrby",keys[1],0-quantity_list[i])
    end
end
 
local function execute()
    -- i 类java for循环 for(int i=0;i<?;i++) 下标
    -- k 为遍历的值 具体值,非下标
    for i, k in ipairs (values)
    do
        -- num 变更数量
        -- key 为缓存key
        local num = tonumber(k)
        local key=  keys[i]
        -- 进行库存扣减,为false 代表扣减失败,要进行回滚
        local result = deduction(key,num)
 
        -- 回滚
        if (result == false)
        then
            rollback()
            return false
        else
            -- 记录可能要回滚的数据
            table.insert(id_list,key)
            table.insert(quantity_list,num)
        end
 
    end
    return true;
end
 
return execute()