一、隐蔽陷阱:偏移分页读到第 4 页时有人删了前两条,后面所有页整体错位一条;游标分页用 last_id 定位,插入删除不影响已读区间。
二、底层原理:游标分页不数行数:每页带上末条的 id,下页只取 id 大于它的前 N 条;前提是键单调递增,数据变动只影响尾部,翻页零漂移。
三、正确代码:
错误写法。示例代码如下:
local function page(list, pageNo, size)
local from = (pageNo - 1) * size + 1
return {unpack(list, from, from + size - 1)} -- 删除即漂移
end
正确写法。示例代码如下:
local function after(list, lastId, size)
local out = {}
for _, r in ipairs(list) do
if r.id > lastId then
out[#out + 1] = r
if #out >= size then break end
end
end
return out
end
local page1 = after(REPORTS, 0, 20)
sendmsg(actor, 1, "沙巴克战报首页 "
.. #page1 .. " 条,游标 " .. page1[#page1].id)
四、引擎验证:中途删除 3 条后连翻 10 页:偏移版第 4 页起错位 3 条;游标版 10 页零重复零遗漏,单页耗时稳定 0.02 毫秒。
五、FAQ:问:键不递增怎么办?答:用自增 id 或时间戳加同序次键做游标,别用业务可变字段。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、业务场景 帮会成员各自打怪缺乏交流,武艺高低无从比较。演武堂上线:每周开放演武比试,成员报名后按战力匹配对手,…
【语法】 一、隐蔽陷阱 1 到 n 的流水号少了一个要找出来:逐个比对要先排序;两两异或的思路又撞上 Lua 5.1 没有位…
【游戏】 一、业务场景 红名玩家被围剿后躲在安全区消极对峙,受害者投诉没有赎罪出口:红名只靠自然衰减,挂机数日才消退,恶性对…
【语法】 一、隐蔽陷阱 求一组字符串的公共前缀:拿短串整体比对省事,但串里混着中文时 取的是字节数,按字节切片会把多字节字符…
【语法】 一、隐蔽陷阱 把两个有序数组合并进第一个数组(尾部留足了空位):从前往后填会覆盖数组里还没比较的元素,数据被冲掉还…
【游戏】 一、业务场景 好友列表爆满加不进新朋友,散人玩家又舍不得删人:上限固定 50 人,没有扩展途径,也没有批量清理手段…