开门的第一分钟是缓存的冰点:全部玩家的第一次背包查询、第一次排行查询全部打穿到数据库,冷缓存的数据库在洪峰面前最早跪下。开服预热把热门数据在开门前装载进缓存,第一波请求打在热缓存上。
---开服预热:热门数据的装载
setontimerex(97, 0)
function Warmup.run()
local jobs = {
{ name = "排行榜", fn = Warmup.ranks },
{ name = "商店货架", fn = Warmup.shops },
{ name = "传送点", fn = Warmup.waypoints },
{ name = "预创角", fn = Warmup.preRoles },
}
for _, job in ipairs(jobs) do
local ok, err = pcall(job.fn)
Ops.log(("预热[%s] %s"):format(
job.name, ok and "完成" or "失败:" .. tostring(err)))
end
end
---排行榜的预热:开门前的首屏数据
function Warmup.ranks()
Cache.put("rank_level", DB.query(
"SELECT name, level FROM roles " ..
"ORDER BY level DESC LIMIT 50"))
end
预热的清单四件套:排行榜的首屏(开门后第一个被点开的界面)、商店的货架(新手买药的高频)、传送点的配置(满地图的传送查询)、预创角的名册(开门的准入校验)。装载走 pcall 的隔离:一项的失败不拖累其余,失败的名目进日志由人工补载。预热的时机在开门前的 5 分钟:太早装载的数据会被开门前的临期变更作废,太晚来不及完成。
---预热的校验:缓存命中率的开门验证
function Warmup.verify()
-- 模拟开门的首波查询,验证命中
local hit = 0
local total = 0
for _, q in ipairs(Warmup.probeQueries()) do
total = total + 1
if Cache.get(q) then hit = hit + 1 end
end
local rate = hit / total
Ops.log(("预热命中率 %.0f%%"):format(rate * 100))
return rate >= 0.9
end
预热的校验用探针查询模拟开门的首波:热门的键逐个探一遍,命中率 90% 以上才放行开门——冷缓存的敞口在开门前量化,不达标即补载重验。预热的清单随版本演进:新玩法的首屏数据进清单,清单的维护与界面的热度数据联动(界面打开率的前十名就是预热的后备名单)。缓存的过期与预热错峰:预热的缓存设较长的新鲜期,开门的半小时内不做过期淘汰,缓存的策略在开门窗口期单独放宽。
开门首分钟的数据库查询量与历史的对照,预热生效的标志是查询量降一个数量级;缓存的命中率分钟级曲线,冷启动的爬坡期被预热压缩到接近零。
预热曾经只装了数据没建索引,缓存的对象结构在首查时才初始化,预热的完整性包含结构。预热的时机曾经太早,开门前的紧急配置变更让缓存与配置不一致,预热挪到配置冻结之后。探针的清单曾经与真实查询脱节,验证的命中率虚高,探针从真实的埋点导出。
预热的清单与界面的热度数据联动,清单的迭代有数据依据。预热任务的失败不阻断开门,失败项的补载有人工的通道。开门后的前 5 分钟数据库的查询量进开服复盘,预热的效果用数字归档。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 行会活动集中在攻城战,日常缺乏轻量社交场景。行会篝火答题做行会固定社交活动:每周三、周日晚在行会驻地点燃…
实战应用:用在哪里 全服答题活动办过几期,参与的人不少但黏性不足,答完就散。科举答题把答题做成两段式:每天晚八点的乡试答题筛…
n n n 实战应用:用在哪里 n战斗中打字沟通慢且危险,队伍协作靠喊话效率太低。快捷短语栏在屏幕底部提供八条可自定义的战斗…
n n n 实战应用:用在哪里 n龙脉区域的野外宝箱是散人玩家的每日福利:每逢整点在龙脉区域随机刷新十五个宝箱,分三档给不同…
实战应用:用在哪里 同一玩家的两条消息走了不同的处理路径,先发的后到,装备穿上的消息比脱下的消息晚处理,面板状态错乱。消息有…
实战应用:用在哪里 战斗日志全量打印,一天写满一块硬盘,翻日志像大海捞针。日志采样按类别分策略:错误日志全量保留、行为日志按…