Java游戏服务器-留存/付费数据统计
游戏上线后,需要统计留存,付费等信息。留存一般关心次日留存,三日留存,周留存和月留存。付费包括平均用户付费等,平均付费用户付费等。
假设我们有以下两个表,分别是用户表(tb_player
)和支付订单表(tb_billing_order
):
1 | CREATE TABLE `tb_player` ( |
所有统计数据都从其中产生。
首先创建一个记录统计数据的表(tb_stat_remain):
1 | CREATE TABLE `tb_stat_remain` ( |
然后创建一个存储过程,用来实际统计数据:
1 | CREATE PROCEDURE `proc_stat_remain`() |
计算并插入昨天的付费相关的数据,同时计算并更新与昨天相关的存留相关的数据。其中调用了两个函数:
1 | CREATE FUNCTION `func_stat_remain`(`yesterday` date, `days` int) RETURNS double |
func_stat_remain
计算与指定日期相隔 days
天的留存率。
1 | -- ---------------------------- |
func_ctz
转换毫秒时间为当前时区日期,时区问题在上篇文章阐述过。
最后创建一个事件:
1 | CREATE EVENT `event_stat_remain` ON SCHEDULE EVERY 1 DAY STARTS '2015-10-01 16:00:00' ON COMPLETION NOT PRESERVE ENABLE DO CALL proc_stat_remain() |
每天零点执行。因为数据库所在时区是UTC(零时区),所以使用 16:00:00
,正好是GMT+8(东八区)的零点。也可以在服务器程序里在每天零点调用上面的主存储过程,就不需要这个事件了。
每天产生存留和付费的基础数据,保存在 tb_stat_remain
表中,具体关心的每项数据从中获取计算即可。