统计网页UV业务

首先搞懂两个概念:

  • 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就可以了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡桃姓胡,蝴蝶也姓胡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值