2016/06/27

游戏留存代码实现


一个快速高效简单统计游戏留存率的方法,用于现在公司游戏运营商业务上。

有一个必须的用户数据表user_play, 主要数据字段有:

user_id 用户id
game_appid 游戏id
promote_id 推广员id
register_time 注册时间(时间戳)
register_ip 注册ip
device_id 注册设备id
login_time 最近登录时间(时间戳)
login_ip 最近登录ip


一个留存统计表retention, 主要数据字段有:

game_appid 游戏id
register_time 注册时间(格式:yyyy-mm-dd)
login_time 登录时间(格式:yyyy-mm-dd)
login_num 登录数


当用户登录时,判断user_play表里是否含有此用户数据,没有则认为是首次游戏注册+登录,添加一条记录到user_play表。此条记录的 注册时间等于登录时间,注册IP等于登录IP。接着通过(游戏id,注册天,登录天)寻找retention表是否含有此记录。如果有,则在登录数里+1, 否则新增一条记录。

如果用户登录时,user_play已经含有此用户数据,则判断用户上一次登录时间和此次登录时间是否为同一天,如果不是同一天,则通过 (游戏id,注册天,此次登录天)寻找retention表是否含有此记录。如果有,则在登录数里+1,否则新增一条记录。最后再更新user_play的登录时间。

//一小段统计数据

+------------+---------------+------------+-----------+
| game_appid | register_time | login_time | login_num | 
+------------+---------------+------------+-----------+
| 1001       | 2016-06-20    | 2016-06-20 | 800       |
| 1001       | 2016-06-20    | 2016-06-21 | 200       |
| 1001       | 2016-06-21    | 2016-06-21 | 500       |
| 1001       | 2016-06-20    | 2016-06-22 | 80        |
| 1001       | 2016-06-21    | 2016-06-22 | 100       |
+------------+---------------+------------+-----------+

我们可以了解到,当注册时间和登录时间相等时,也就是此游戏当天的新增用户数。如 2016-06-20 新增用户数为800人,这800人中,在 第二天(2016-06-21)登录有200人。这800人中,在第三天(2016-06-22)登录有80人。

已知次日留存率算法为: (第一天新增用户中,在第二天还登录的用户数)/第一天新增用户数

所以我们可算得 2016-06-20 的 次日留存为:

retention_day1 = (200/800)*100% = 25%

按照以上做法我们就可以算得任何一天的留存,如 2016-06-20 的 2日留存率

retention_day2 = (80/800)*100% = 10%

总结:

  1. 按照此方法进行留存率计算,将大大减少数据的统计,无需用户每次登录都要写入一条记录。

  2. 统计某一天的留存率,我们只需要提取必要的两条记录,一条注册时间等于登录时间的记录,和一条需要计算留存率时间的记录。对这 两天记录做登录数相除即可。

  3. 使用用户注册时间作为基准,真正做到不用关注游戏实际开服时间。

  4. 数据直观明了,单从数据表我们也可以快速定位到数据情况。

  5. 实现简单。