【发布时间】:2017-10-09 07:18:13
【问题描述】:
我相信我找到了一个非常好的快速解决方案来有效地计算页面浏览量:
此处为 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(或更多)小时后被删除。因此,我认为这不是一个好的解决方案。
我猜想写入和读取某个文件是理想的/必要的,但不确定如何有效地完成此操作。非常感谢您的帮助
【问题讨论】:
-
大部分优化可能不需要,但是在我们的办公室,因为我们正在处理大量数据;我们使用 nosql 存储来自不同客户端的各种更新,然后我们对我们的数据进行某种分析,继续对我们的数据进行某种汇总;因此我们稍微关注客户端如何更新,更多关注更新本身的内容
-
定义“同一个人”。
-
@zerkms 也许“同一设备”是一个更好的术语。应该防止人们通过简单地刷新页面来增加查看次数
-
@fisker HTTP 没有“设备”概念。只需设置一个包含上次计算访问时间的 cookie。
-
其中任何一个都很容易被滥用,我看不出有什么区别。但是 cookie 解决方案更便宜且更易于实施/维护。现在考虑您是否要对能够有效提供同样低水平保护的解决方案进行更多投资。我不坚持,你自己决定。
标签: go