lua-conf 让配置信息在不同的 lua 虚拟机间共享
有时候我们的项目需要大量的配置表(尤其是网络游戏) 。因为主要用 lua 做开发,我们倾向于直接用 lua table 保存这些配置常量。
海量的数据有两个问题:
这些配置数据在运行期是不变的,但树型结构复杂,放在 lua 虚拟机内会生成大量的 gc object ,拖满 lua 的垃圾收集器。因为每次扫描都需要把所有配置数据都标记一遍。
在服务器端,我们使用 skynet 框架,会启动数千个 lua 虚拟机。如果每个虚拟机都加载一份配置信息,会带来大量的内存浪费。
基于这两点,我实现了 lua-conf 这个模块。它可以把一个 lua 表转换成一个 C 对象。在 lua 中得到的是一个lightuserdata (不是 userdata ,也不能自动回收,这是因为我希望它可以被多个 lua state 共享)。
经过简单的包装,可以在语法上模拟 lua table 来访问它。weaktable 用来 cache 常用的配置数据项。
这个 C 对象的访问是线程安全的,所以你可以放心的在多线程的多个 lua state 中共享访问它。
注:lua-conf 支持的数据类型是有限的。它必须是一个无环的树型结构。key 必须是整数(除了正整数,也支持 0 或负数)或字符串。而 value 必须是 boolean string number 或 table 。