| 12345678910111213141516171819202122232425262728293031323334353637 |
- --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
|