--KEY值 local key=KEYS[1] --桶容量 local buketSize=tonumber(KEYS[2]) --令牌产出时间 local rate=ARGV[1] --此次更新时间 local UpdateTime=ARGV[2] --var为集合,剩余令牌数量【1】,更新时间【2】 local remain = tonumber(redis.call("hget",key,"remainToken")) local lastRefreshTime=redis.call("hget",key,"lastRefreshTime") --首次创建 if type(remain)=="nil" then remain=math.ceil(buketSize/2) redis.call("hset",key,"lastRefreshTime",UpdateTime) redis.call("hset",key,"remainToken",remain) lastRefreshTime=UpdateTime end if(remain<=0) then local newTokens=math.ceil((UpdateTime-lastRefreshTime)/rate) local refreshToken=newTokens if(refreshToken<=0) then return 0 end if(refreshToken>buketSize) then refreshToken=buketSize end redis.call("hset",key,"lastRefreshTime",UpdateTime) redis.call("hset",key,"remainToken",refreshToken) else redis.call("hset",key,"remainToken",remain-1) end return 1