美文网首页程序员
laravel + redis 实现月活与日活统计

laravel + redis 实现月活与日活统计

作者: 咯噔爸比 | 来源:发表于2020-08-12 14:48 被阅读0次

做日活与月活的统计分析

寻求了好多解决方案最后选择了采用redis BitMap 的方式来做操作

BitMap是什么

就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。存储1亿个用户的状态的话大约是12M的大小||大概的空间占用计算公式是:(数量/8/1024/1024)MB
简单说明,每一个bit位代表着一个用户的id 有活跃就记为1 没有活跃就记为0
如果想要详细了解的话:需要了解一下位运算相关的知识 https://www.sohu.com/a/300039010_114877

laravel 进行日活统计流程中事件的相关应用

1.注册事件和监听器 到 EventServiceProvider中

 protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
        'App\Events\ActiveLog' => [
            'App\Listeners\SendActive@log',
        ],
        'App\Events\StatisticActive' => [
            'App\Listeners\SendActive@index',
        ],
    ];

2.生成事件 & 监听器

执行命令 php artisan event:generate

3.定义事件创建事件实例

#event文件夹下
class ActiveLog
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    public $uid;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($uid)
    {
        //
        $this->uid = $uid;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}
class SendActive
{
    public $_prefix_key='user_action::';
    public $_redis =null;
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
        $this->_redis=app('redis.connection');
    }

    /**
     * Handle the event.
     *
     * @param  StatisticActive  $event
     * @return void
     */
    public function handle(StatisticActive $event)
    {
        //
        //dd($event);
    }
    //统计分析 按日统计按月统计
    public function index(StatisticActive $event){
        //日统计
        $this->day();
        //月统计
        $this->month();

    }
    //记录日志
    public function log(ActiveLog $event){
        $userid=$event->uid;
        $key=date('Ymd');
        $key=$this->_prefix_key.$key;
        //记录日活数据
        $this->_redis->setbit($key,$userid,1);

    }
    //每日执行一次
    public function day(){
        //计算日活跃写入数据库
        $day = date('Ymd',strtotime("-1 days"));
        $key =$this->_prefix_key.$day;
        $total=$this->_redis->bitCount($key);
        DB::table('statistics_active')->insert(['day'=>$day,'total'=>$total??0]);
    }
    //按月计算
    public function month(){
        $days = date('t', strtotime("-1 days"));
        $start_time = strtotime(date('Y-m-01',strtotime("-1 days")));  //获取本月第一天时间戳
        $month = date('Ym',$start_time);
        $key=$month.'month_active';
        $this->_redis->del($key);
        for($i=0;$i<$days;$i++){
            $str = $this->_prefix_key.date('Ymd',$start_time+$i*86400); //每隔一天赋值给数组
            $this->_redis->bitOp('or',$key,$key,$str);
        }
        $total=$this->_redis->bitCount($key);
        $this->_redis->del($key);
        DB::table('statistics_active')->insert(['day'=>$month,'total'=>$total??0]);
    }
}

4.事件调用

#我方在中间件中用户访问的时候增加这个记录的
if (!empty($userid)){
                event(new ActiveLog($userid));
                $this->addlog($userid);
            }

做一下记录,今天北京说有暴雨建议单位居家办公。。。结果我司无动于衷呀。。。

相关文章

  • laravel + redis 实现月活与日活统计

    做日活与月活的统计分析 寻求了好多解决方案最后选择了采用redis BitMap 的方式来做操作 BitMap是什...

  • 跳跃表python实践

    redis的zset常用场景:统计日活;打赏排行榜;天梯榜等zset底层基于跳跃表实现 跳跃表代码实现,练习版

  • 用户日活月活怎么统计 - Redis HyperLogLog 详

    HyperLogLog 是一种概率数据结构,用来估算数据的基数。数据集可以是网站访客的 IP 地址,E-mail ...

  • 用Redis统计日活(基于Redission)

    思路,搞一个集合,将当天登陆过的用户的id,存起来,用于统计日活; 目前,用Redis统计日活的方案有3种:1.使...

  • 推荐一个常用的app日活月活统计工具

    什么是日活,什么是月活,统计了有什么意义? 你有没有认真的考虑过日活和月活是怎么计算的,它们的背后具有怎样的逻辑定...

  • redis键空间过期

    背景概要 其他方案 实现修改redis配置键空间通知演示结合Laravel artisan实现报错记录如何使监听后...

  • Mongodb 选型笔记

    参考:comparing-in-memory-databases-redis-vs-mongodb 优点: 社区活...

  • 学习List

    LearningIndex全链路压测 Redis框架Huskar 多活

  • Laravel 文章汇集

    LARAVEL .ENV文件配数组laravel redis操作大全laravel5篇之使用事务laravel多库...

  • 关于日活/月活

    最近看到个指标,用日活/月活,这里简单记录一下 原文参考:为什么日活/月活能衡量用户粘性? 日活/月活,用于衡量社...

网友评论

    本文标题:laravel + redis 实现月活与日活统计

    本文链接:https://www.haomeiwen.com/subject/smupdktx.html