我是靠谱客的博主 敏感白昼,最近开发中收集的这篇文章主要介绍统计网页UV业务HyperLogLog,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

首先搞懂两个概念:

  • 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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部