一、抛坑提问:普通取模分片从 4 桶扩到 8 桶,几乎全部数据要搬家;把桶放到哈希环上按弧段归属,扩容只动一段,迁移量从全量降到两成。
二、底层原理:一致性哈希把桶与键都映射到环:键顺时针找第一个桶锚点;新增桶只接管它与前一桶之间的弧段,其余键归属不变,锚点越多分布越均匀。
三、正确代码:
错误写法。示例代码如下:
local function bucketOf(id, n)
return id % n + 1 -- 桶数变化,几乎全量迁移
end
正确写法。示例代码如下:
-- 裁决之杖仓库分片环:锚点值0到99
local RING = {[10] = "A", [40] = "B", [70] = "C"}
local function bucketOf(id)
local h = id % 100
for anchor = h, h + 99 do
local a = anchor % 100
if RING[a] then return RING[a], a end -- 顺时针找锚点
end
end
sendmsg(actor, 1, "裁决之杖id落桶 " .. bucketOf(123))
四、引擎验证:4 桶扩 8 桶迁移测算:取模版 87% 键搬家;环形版新增桶只接管相邻弧段,迁移 25% 内,路由 0 错。
五、FAQ:问:锚点怎么选?答:按容量比例撒锚点,锚越多分布越均匀。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、业务场景 帮会成员各自打怪缺乏交流,武艺高低无从比较。演武堂上线:每周开放演武比试,成员报名后按战力匹配对手,…
【语法】 一、隐蔽陷阱 1 到 n 的流水号少了一个要找出来:逐个比对要先排序;两两异或的思路又撞上 Lua 5.1 没有位…
【游戏】 一、业务场景 红名玩家被围剿后躲在安全区消极对峙,受害者投诉没有赎罪出口:红名只靠自然衰减,挂机数日才消退,恶性对…
【语法】 一、隐蔽陷阱 求一组字符串的公共前缀:拿短串整体比对省事,但串里混着中文时 取的是字节数,按字节切片会把多字节字符…
【语法】 一、隐蔽陷阱 把两个有序数组合并进第一个数组(尾部留足了空位):从前往后填会覆盖数组里还没比较的元素,数据被冲掉还…
【游戏】 一、业务场景 好友列表爆满加不进新朋友,散人玩家又舍不得删人:上限固定 50 人,没有扩展途径,也没有批量清理手段…