跨服战场的每局战报都是数据资产:段位变化、击杀明细、MVP 时刻,赛季结束后这些数据要归档保存。战报的存储用冷热分层:当赛季的热数据随时可查,历史赛季的冷数据压缩归档,存储的成本与查询的便利各得其所。
---战报的分层写入
function WarReport.store(report)
if report.season == currentSeason then
hotStore[#hotStore + 1] = report
else
ColdArchive.write(report.season, report)
end
end
---赛季结束的批量转冷
function WarReport.freeze(season)
local reports = hotStore.bySeason(season)
ColdArchive.bulkWrite(season, reports)
for i = #hotStore, 1, -1 do
if hotStore[i].season == season then table.remove(hotStore, i) end
end
end
当赛季的战报在热存储支持随机查询,历史赛季的批量转冷释放热存储的容量。转冷的批次按一千条一组写入压缩包,归档的完整性用条数与校验和双重验证。冷数据的查询走解压检索的慢通道,荣誉的历史追溯场景可以接受秒级的等待。
---冷数据的检索:按玩家与赛季过滤
function WarReport.coldQuery(userId, season)
local archive = ColdArchive.load(season)
local out = {}
for _, rep in ipairs(archive) do
if rep.userId == userId then out[#out + 1] = rep end
end
return out
end
冷查询按玩家 ID 过滤归档记录,个人的赛季战绩完整还原。战报的归档字段包含段位、击杀、伤害与 MVP 标记,数据的颗粒度支撑荣誉页面的每一个展示细节。归档的压缩率实测 8 比 1,一个赛季的战报压缩后不到 200MB,存储的成本可控。
转冷的条数与热存储的删除数对账,归档的校验和验证保证冷数据完整可读。
转冷的批次曾经写错了赛季字段,两个赛季的数据混进同一个归档包,赛季字段的断言校验补上后修复。冷查询的解压没有缓存,同一赛季的反复查询重复解压,解压结果的会话缓存让第二次查询毫秒返回。
赛季的结束触发三件事:战报转冷、段位重置、荣誉结算,三件事的顺序与依赖写进赛季关闭的清单。冷数据的保留期三年,跨年的荣誉追溯有数据可依。归档的格式版本化,引擎升级后的归档读取兼容旧版本,数据的寿命长于代码的寿命。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 沃玛教主血量每降一档触发一次全服播报,播报逻辑散在伤害结算里,改一条文案翻三个文件。时间轴框架把阶段播报…
实战应用:用在哪里 金位摊位成了稀缺资产,私下转让滋生倒卖。过户系统把转让收编:双方确认、缴纳成交价一成的过户费、转让后原主…
实战应用:用在哪里 师门积分商店的热门商品每周限购两件,限购状态跨周重置的口径必须稳:本周已购几件、下周何时刷新、补签周怎么…
实战应用:用在哪里 练级区怪物密度是玩家口碑的晴雨表:太密抢怪打架,太稀挂机空转。密度动态平衡机制把刷新倍率做成运营参数,按…
实战应用:用在哪里 新玩家不知道安全区边界在哪,迈出一步被野怪围殴,第一印象直接崩坏。边界警示方案:接近安全区边界时地面浮现…
实战应用:用在哪里 自动寻路省心但让玩家成了观光客,手动跑图自由却容易迷路。追踪切换方案:任务追踪面板提供自动与手动两种模式…