概述
首先搞懂两个概念:
- UV:独立访客量,是指通过互联网访问,浏览这个网页的自然人。1天内同一个用户多次访问该网站,只记录1次。
- PV:也叫页面访问量或者点击量,用户每访问网站的一个页面,记录1次PV,用户多次打开页面,则记录多次PV。往往用来衡量网页的流量。
我们今天是来统计UV:
我的第一个想法是:使用redis的哈希表,但是这样内存占用太过于大了!
因此我们要了解一下redis给我们提供的HyperLogLog。
HyperLogLog
我们先用一句话概括一下HyperLogLog的特点:
提供不精准的去重计数。
它的优点是,在输入元素的数量或者体积非常非常大的时候,计算基数所需的内存空间总是固定的,并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64
个不同元素的基数,和元素越多就越耗费内存的 Set 和 Hash 类型相比,HyperLogLog 就非常节省空间。
我们先来看一下常用指令:
# 添加指定元素到 HyperLogLog 中
PFADD key element [element ...]
# 返回给定 HyperLogLog 的基数估算值。
PFCOUNT key [key ...]
# 将多个 HyperLogLog 合并为一个 HyperLogLog
PFMERGE destkey sourcekey [sourcekey ...]
代码实现,这个代码实现非常简单,我们写一个中间件就可以了:
// Uv 用户UV统计的中间件, 使用HyperLogLog
func Uv() gin.HandlerFunc {
return func(c *gin.Context) {
// 先获取前端HTTP请求头里面发过来的IP地址,我们通过IP地址来进行UV统计
ip := c.GetHeader("ip")
if ip == "" {
// 如果是空的话,说明前端没有传过来信息,这里就不进行统计了
c.JSON(http.StatusForbidden, gin.H{
"status": http.StatusForbidden,
"msg": "请求没有携带用户的相关信息,无法进行统计",
})
// 在被调用的函数中阻止后续中间件的执行
c.Abort()
return
}
// 不为空,进行UV统计
err := dao.Rdb.PFAdd(dao.RCtx, common.WebUv, ip).Err()
if err != nil {
log.Println(err)
}
return
}
}
前端把用户的信息放过来,我们计入到redis就可以了。
最后
以上就是敏感白昼为你收集整理的统计网页UV业务HyperLogLog的全部内容,希望文章能够帮你解决统计网页UV业务HyperLogLog所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复