我有一个100亿行的访问日志文件。每行由时间戳和用户cookie字符串组成。为了简单起见,让我们假设每个用户只有一个永久cookie字符串。我需要使系统,可以返回给定的时间流逝独特的游客数量。时间间隔必须至少为1天,最多为3年。例如:5月26日到9月10日的独立用户数,我也只有4 4gb的内存和无限的硬盘。请任何想法,我更好地使用数据库管理系统,以及什么模式设计是更好的。我从来没有处理过这么大的数据量。
发布于 2018-09-25 02:36:53
一个非常有效的方法是使用Redis内置的BITFIELD或SET特性。基本上,每天存储一个条目,其中包含当天的一组唯一标识符(在set实现的情况下)或一个位字段,其中每个位置代表一个不同的cookie ID (请注意,这些位置必须随时间保持一致,如果您不能预先枚举您的ID,这将变得棘手,因为cookie ID具有很高的流失率)。
Avichal Garg @avichal在GetSpool.com上有一篇关于这方面的奇妙文章,其中他们展示了针对这个用例的奇妙的实时查询性能:
在一个有1.28亿用户的模拟中,一个典型的指标,如“每日唯一用户”,在MacBook专业版上只需要不到50ms,并且只需要16MB的内存。
请注意,这个解决方案不仅让您计算唯一性,而且实际上可以准确地告诉您哪些用户--不是以抽样或近似HyperLogLog的方式,而是以一种真实、完整和准确的用户列表的方式。
在之前的工作中,我在生产中使用了相同的方法,我可以验证他们的结果。
https://stackoverflow.com/questions/52472014
复制相似问题