--KEYS[1]: Map名称,KEYS[2]: Cou当前值KEY KEYS[3]: Cou最大值KEY  KEYS[4]: 更新锁KEY
--ARGV[1]: Cou最大值 ARGV[2]: Cou当前值 ARGV[3]: 更新超时时间
local mapKey = KEYS[1];
local maxKey = KEYS[2];
local curKey = KEYS[3];
local updKey = KEYS[4];
local maxArg = tonumber(ARGV[1]);
local curArg = tonumber(ARGV[2]);
local timeout = tonumber(ARGV[3]);

--更新COU缓存
if maxArg > 0 then
	redis.call('HMSET', mapKey, maxKey, maxArg, curKey, curArg + 1);
	redis.call('DEL',updKey);
	return curArg;
end
--cou存在且缓冲区仍有空余
local cur = tonumber(redis.call('HGET',mapKey,curKey));
if cur and cur < tonumber(redis.call('HGET',mapKey,maxKey)) then
	redis.call('HSET',mapKey,curKey,cur+1);
	return cur;
end
--C0U不存在或者C0U缓存已使用完
if tonumber(redis.call('GET',updKey)) == -2 then
	return -2;
end
redis.call('SETEX',updKey,timeout,-2);
if cur then
	return -1;
end
return -3;