确保我的Go页面查看计数器没有被滥用

时间:2017-10-09 07:18:14

标签: go

我相信我找到了一个非常好的快速解决方案来有效地计算页面浏览量:

go go playground中的工作示例:https://play.golang.org/p/q_mYEYLa1h

我的想法是每隔X分钟将其推送到数据库,然后按下一个键,然后从页面地图中删除它。

我现在的问题是,确保不被滥用的最佳方法是什么?理想情况下,如果自上次访问页面后有2小时的时间间隔,我只想增加同一个人的页数。 据我所知,存储和比较IP和用户代理(我不想依赖cookie / localstorage)是理想的,但我不太确定如何有效地存储和比较这个信息。

我可能会从http.Request获得IP(req.Header.Get("x-forwarded-for"))和UserAgent(req.UserAgent())。

我在考虑创建一个类似于我的页面结构的访问者结构,如下所示:

type visitor struct {
    mutex          sync.Mutex
    urlIPUAAndTime map[string]time
}

这种方式应该可以做类似以前的事情。但是,想象一下,如果网站有如此多的请求,那么将存储数亿个独特的访问者地图,并且每个访问者地图只能在2(或更多)小时后删除。因此,我认为这不是一个好的解决方案。

我认为写入和读取某些文件是理想/必要的,但不确定如何有效地完成这项工作。非常感谢帮助

1 个答案:

答案 0 :(得分:1)

优化方法之一是在此地图之前添加Bloom过滤器。布隆过滤器是一种概率结构,可以说其中之一:

  • 此用户绝对是新用户

  • 此用户可能在这里

这是一种在早期阶段切断计算的方法。如果您的许多用户都是新用户,则将请求保存到数据库以检查所有用户。 如果结构说“用户可能不是唯一的”怎么办?然后你去数据库并检查它。 这里还有一个优化:如果您不需要非常准确的信息并且可以同意几个百分比的错误,您可以使用唯一的布隆过滤器。我猜很多大型网站都使用这种技术进行估算。