if(redis.call('hexists', KEYS[1], KEYS[2]) == 1) then
local stock = tonumber(redis.call('hget', KEYS[1], KEYS[2]));
if(stock > 0) then
redis.call('hincrby', KEYS[1], KEYS[2], 1)
return stock;
end;
return 0;
end;
string
local function isempty(s)
return s == nil or s == ''
end
if(redis.call("exists", ARGV[1]) == 1) then
local stock = tonumber(redis.call('get', ARGV[1]));
local delta;
-- ARGV[2] 为空时才执行
if isempty(ARGV[2]) then
delta = -1;
else
delta = ARGV[2];
end;
if(stock > 0) then
redis.call('incrby', ARGV[1], delta)
return true;
end;
return false;
else
return false;
end;
1. 减库存
tryLock()
对 get 和 decr 加锁操作;可以使用 lua 脚本进行原子控制;
2. 一人一单
高并发下会有问题
使用 redis 锁, 针对个人<抢占到锁才可以下单>
可以使用 bitmap 维护是否下单: 成功下单后则进行标识修改
在指定时间过期