readinibycache 与 writeinibycache 是 ini 文件读写的缓存版本:首次读取加载到内存缓存,后续读取走缓存不再触碰磁盘,写入时同步更新缓存与延迟落盘。缓存的策略让高频读写的 ini 配置不再成为 IO 瓶颈。
---ini 的缓存读取
function readinibycache(actor, section, item)
local key = actor:GetUserId() .. ":" .. section
local cache = iniCache[key]
if not cache then
cache = readini(actor, section, item)
iniCache[key] = cache
end
return cache[item]
end
首次读取从磁盘加载到内存缓存,后续读取走缓存。缓存的键按玩家加分区隔离,不同玩家的缓存互不干扰。缓存的上限按玩家数量控制,每个玩家的 ini 数据量小(几 KB),千人的总缓存在可接受范围。
---ini 的缓存写入
function writeinibycache(actor, section, item, value)
local key = actor:GetUserId() .. ":" .. section
local cache = iniCache[key]
if not cache then
cache = readini(actor, section, item) or {}
iniCache[key] = cache
end
cache[item] = value
dirtyIni[key] = true
end
写入先更新内存缓存再标记脏,脏标记的落盘由定时任务批量执行,写入的 IO 压力被摊平。脏标记的落盘频率:每 30 秒批量刷一次,突然宕机最多丢 30 秒的写入,可接受的丢失窗口。ini 的缓存在玩家下线时主动刷盘并释放,长期在线的玩家定时刷盘防堆积。
ini 缓存的命中率与脏标记数量监控,命中率低于八成说明缓存策略需要调整。
缓存的写入曾经没有同步磁盘文件,宕机后丢失了整批的写入,脏标记的定时落盘解决。ini 的并发写入曾经出现文件锁冲突,同一文件的写入加互斥锁后消除。
ini 缓存的封装对业务层透明:业务的读写接口不变,底层自动走缓存。ini 文件的清理任务配合缓存的生命周期,下线玩家的缓存释放与磁盘同步。ini 的格式版本化:引擎升级后 ini 格式变化要有转换脚本,老档的 ini 数据不丢失。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 三个月的主线剧情跨度太长,老玩家回坑记不住剧情走向。回顾手册把每个章节的关键节点做成时间线卡片:章节名、…
实战应用:用在哪里 每次全量更新包两百兆,玩家在流量下望而却步。差分分发只下发新旧版本的差异块:一兆的全量更新压成八十兆差分…
实战应用:用在哪里 新玩法灰度上线后“观察一下”是最模糊的指令。观察指标清单把观察期变成可执行的检查表:参与率、异常率、资源…
实战应用:用在哪里 行会义卖活动把流拍装备低价义卖,宣称收益全捐新手基金,活动结束后玩家质疑“钱去哪了”。复盘把公益金流向做…
实战应用:用在哪里 技能升级要消耗技能书与金币,升完才发现收益不如预期是常见的挫败。试算面板在升级前模拟展示升级后的属性变化…
实战应用:用在哪里 道士的群体治疗一次奶全队,无衰减的群体治疗会让治疗量溢出成无敌盾。治疗量衰减机制:每多一名目标,单体治疗…