Loading...
墨滴

卡二条

2021/04/14  阅读:36  主题:橙心

Redis实现页面访问总数据统计

文章简介

该文将从Redis的角度来总结几种页面访问统计,这里的页面统计是针对某一个具体的页面进行每天的数量统计,后面文章内容涉及到的page_id指的就是页面的独立ID,每一个页面的ID都是不重复的。演示代码使用Laravel5.8版本实现。具体代码可以参考https://gitee.com/bruce_qiq/laravel-design.git。

具体实现

Snipaste_2021-03-28_19-21-44
Snipaste_2021-03-28_19-21-44

页面总访问数量

页面总访问数量,统计了每个页面的总访问数量,不排除重复用户重复访问的情况,只要页面被访问就需要统计。

主要的实现思路是,给每一个页面划分一个ID,叫做page_id。我们使用字符串类型进行数量统计。

// 1. 实现某个页面访问统计
// url:$http/api/redis/demo1?page_id=1
public function demo1()
{
    $pageId = $this->request['page_id'];
    echo Redis::connection()->incrby('page:number:' . date('Y-m-d') . ':' . $pageId, 1);
}

页面独立访问用户

页面独立访问用户,是针对某个具体的用户来进行数据统计。例如,有一个页面的page_id是1,此时用户的ID也是1,这时候就需要对page_id为1的数据进行缓存,并且将用户ID为1的数据添加到对应的缓存中。 下面使用set、bitmap、hyperLogLog来实现。

  1. set实现
// 2. 实现某个页面独立用户访问统计(使用set实现)
// url:$http/api/redis/demo2?page_id=1&user_id=1
public function demo2()
{
    $pageId = $this->request['page_id'];
    $userId = $this->request['user_id'];
    Redis::connection()->sadd('page:number:set:' . date('Y-m-d') . ':' . $pageId, $userId);
    echo Redis::connection()->smembers('page:number:set:' . date('Y-m-d') . ':' . $pageId);
}
  1. bitmap实现
// 3. 实现某个页面独立用户访问统计(使用bitmap实现)
// url:$http/api/redis/demo3?page_id=1&user_id=1
public function demo3()
{
    $pageId = $this->request['page_id'];
    $userId = $this->request['user_id'];
    Redis::connection()->setbit('page:number:bitmap:' . date('Y-m-d') . ':' . $pageId, $userId, 1);
    echo Redis::connection()->bitcount('page:number:bitmap:' . date('Y-m-d') . ':' . $pageId);
}
  1. hyperlog实现
// 4. 实现某个页面独立访问用户统计(使用hyperLogLog实现)
// url:$http/api/redis/demo4?page_id=1&user_id=1
public function demo4()
{
    $pageId = $this->request['page_id'];
    $userId = $this->request['user_id'];
    Redis::connection()->pfadd('page:number:perf:' . date('Y-m-d') . ':' . $pageId, $userId);
    echo Redis::connection()->pfcount('page:number:perf:' . date('Y-m-d') . ':' . $pageId);
}
  1. 使用set进行统计,可以将某一个具体的页面和对应的用户ID给统计到缓存中,并且set是去重的,因此能够保证数据的准确性。同时也可以针对某一个具体的页面或某一个具体的用户进行访问统计,还可以针对访问的记录,做用户留存情况、访问情况分析。

  2. 使用bitmap实现是一种弄节省内存的方式,底层在存储时,采用二进制的格式,只会存储0或者1。只要访问过就设置为1。既可以统计出具体的总数据,也可以根据offset统计到某个用户的访问记录,还可以做交集、差集等计算。

  3. 使用hyperLogLog方式进行统计,其实也是一种节省内存的方式。不过该方式存在一定的误差,如果对于数据准确性高的情况,不推荐使用。并且该方式只适合总数统计,不适合具体的数据查询。

卡二条

2021/04/14  阅读:36  主题:橙心

作者介绍

卡二条