local toint = math.tointeger
local tsort = table.sort
local class = require "class"
local LoadBalance = class ("LoadBalance")
function LoadBalance:ctor()
self.map = {}
self.list = {}
self.started = false
end
local function cmp(o1, o2)
return o1.n < o2.n
end
function LoadBalance:sort()
return tsort(self.list, cmp)
end
---comment 注册
---@param id string | integer @唯一标识
---@param n integer ? @初始连接数
function LoadBalance:set(id, n)
if self.map[id] then
error("LoadBalance already have this id.", 2)
end
local info = { n = toint(n) or 0, id = id }
self.map[id] = info
self.list[#self.list+1] = info
end
---comment 获取下一个`ID`
function LoadBalance:nextid()
if not self.started then
self.mask = #self.list
if self.mask < 1 then
error("LoadBalance is empty list.", 2)
end
self:sort()
self.started = true
end
return self.list[1].id
end
---comment 递增连接数
---@param id string | integer @唯一标识
---@param step integer ? @步长
function LoadBalance:incr(id, step)
local info = self.map[id]
if not info then
error("LoadBalance can't find id.", 2)
end
info.n = info.n + (toint(step) or 1)
self:sort()
end
---comment 递减连接数
---@param id string | integer @唯一标识
---@param step integer ? @步长
function LoadBalance:decr(id, step)
local info = self.map[id]
if not info then
error("LoadBalance can't find id.", 2)
end
info.n = info.n - (toint(step) or 1)
self:sort()
end
local lb = LoadBalance()
lb:set(1, 100)
lb:set(2, 102)
local id = lb:nextid(); lb:incr(id)
print(id)
local id = lb:nextid(); lb:incr(id)
print(id)
local id = lb:nextid(); lb:incr(id)
print(id)
local id = lb:nextid(); lb:incr(id)
print(id)
local id = lb:nextid(); lb:incr(id)
print(id)
local id = lb:nextid(); lb:incr(id)
print(id)
输出:
1
1
1
2
2
1