用户活跃度设计
起因
公司产品经理要求后台需要统计用户的活跃度,原需求大概是这样的:我们要统计每一天,每三天和每个月的用户访问量(包括匿名用户)。
设计思路
使用redis的set结构来进行用户ip的存储,然后使用30个set来记录一个月中每一天的用户量。设计流程图如下:
实现流程(未实现版)
首先在 Redis 中创建 30 个 set,然后将今天的访问 IP 统计并存储到 set1 中。在某个结算节点(例如晚上 11:59)进行 IP 结算和数据转移,简单来说就是将所有保存的数据往后移一天。示例图如下
如果想要今日的用户活跃度直接返回set1的长度,想要3日内的用户活跃度返回set1和set2和set3的并集长度同理可得30天的用户活跃度。
需求改变(最终实现版)
以上的实现流程是我思考了大概一个小时后的结果。我提出,统计用户在3天和30天内的活跃度没有太大的意义,不如改为每天统计数据。这样可以减少系统的存储量,而且通过对比每天的数据,可以看出我们网站的吸引力是否比之前更高,这比以前的方法更合理。最后,经过我的努力争取,需求改为每天统计访问用户量并将每天的数据都存储下来。实现图如下:
需求改变说明
首先,存储30天每天的IP量是浪费了29个set的空间。进行数据操作时,唯一的好处就是统计的活跃度非常真实。如果改为只统计今日的数据,那么我们就可以只把今日的统计结果记录,节省了很多资源。例如,之前的29个set可能都需要记录一万个IP,而现在只需要记录2023-09-10的访问量10000。其次,如果按照之前的逻辑设计,进行数据的并集也是不小的系统开销,而现在只需要返回记录set的前30天的数据即可。并且,就我们公司现状来说(刚刚起步不久的公司),统计每天的访问量即可以看出我们网站的热度。
结语
我觉得哈用户活跃度还是统计注册用户比较好,这样只需要给用户一个最后在线时间的属性即可实现(╯^╰)。