使用redis做pv、uv、click統計


redis實時統計
設計思路:
1、 前端smarty插件(smarty_function_murl),將網站所有的連接生成一個urlid,后端根據獲取的參數將需要的數據存入redis。
2、后端插件(smarty_function_aurl),將urlid傳入redis獲取數據。
3、定時將數據跑出來存入關系數據庫,清除redis記錄

縮減開支事業部沒了,編入其它組織了,這個東西我就停工了,分享下思路和代碼。

 

<?php
/**
     * 返回 redis 實例
     * @staticvar \Redis $_redis
     * @param int $database redis數據庫
     * @return \Redis
     */
    public function redisw($database = 2) {
        static $_redis_w;
        if (is_null($_redis_w) || !($_redis_w instanceof \Redis)) {
            $_redis_w = new \Redis;
            $_redis_w->pconnect("xx.xx.xx.xxx:8301");
            $_redis_w->auth('abc');
        }
        $_redis_w->select($database);
        return $_redis_w;
    }
 
    /**
     * 讀 返回 redis 實例
     * @staticvar \Redis $_redis
     * @param int $database redis數據庫
     * @return \Redis
     */
    public function redisr($database = 2) {
        static $_redis_r;
        if (is_null($_redis_r) || !($_redis_r instanceof \Redis)) {
            $_redis_r = new \Redis;
            $_redis_w->pconnect("xx.xx.xx.xxx:8301");
            $_redis_r->auth('abc');
        }
        $_redis_r->select($database);
        return $_redis_r;
    }
 
    // 析構函數
    public function __destruct() {
         
    }
    /**
     *按天查詢pv總數
     * @param string $day
     * 可以為空,默認是查詢當天的(20121220)
     * @return int
     */
    public function pv($day=null)
    {
       if(empty($day))
           $day = $this->_key;
        $key=$this->_pv_key.$this->_key;
        return $this->_redisr->zcard($key);
         
    }
    /*
     * 按天查詢uv
     * @param string $day
     * 可以為空,默認是查詢當天的(格式=20121220)
     * @return int
     */
    public function uv($day=null)
    {
       if(empty($day))
           $day = $this->_key;
        $key=$this->_hs_key.$this->_key;
        return count($this->_redisr->keys($key."*"));
    }
    /*
     * 按條件查詢pv,uv數據
     * @param string $type,按類型查詢,支持{pv、uv、ck}
     * @param string $key,查詢的key目前支持{$urlid\},默認查詢首頁的key
     * @param int    $start 開始時間,時間戳格式,默認當天凌晨
     * @param init  $end  結束時間戳,默認當前時間戳
     * $return int
     */
    public function pvslot($type='pv',$key=null,$start=0,$end=0)
    {
        $pv=$uv=0;
        $pv_arr=array();
        if(empty($key))
            $key =  $this->_homepage_key;
        if($start==0)
            $start = strtotime (date('Ymd' . '00:00:01'));
        if($end==0)
            $end = $this->_time;
        //統計pv的數據
        $pv_arr = $this->_redisr->zrangebyscore($this->_url_key.$key, $start, $end);
        $pv=count($pv_arr);
        if($type=='pv')
            return $pv;
        //統計uv的數據
        $uv_arr = array();       
        if ($pv > 0) {
            //direct::10.2.5.186::1356073254::ju82lv4girj508udt0dv6bts72
            foreach ($pv_arr as $po):
                $po_ar = explode('::', $po);
                if (!in_array($po_ar[3], $uv_arr)) {
                    $uv_arr[] = $po_ar[3];
                }
            endforeach;
         $uv = count($uv_arr);
        }
        unset($pv_arr);
        unset($uv_arr);
        if($type=='uv')
            return $uv;
        //統計ck點擊數
        if($type=='ck')
            return count($this->_redisr->zrangebyscore($this->_ck_key.$key,$start,$end)); //url pv
    }
 
 
 
 
    /*
     * ip地址
     */
    static function _ip() {
        foreach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR') as $p) {
            if (!empty($_SERVER[$p])) {
                return $_SERVER[$p];
            }
        }
    }
    /**
     * 獲取當前時間
     * @return int
     */
    public function _time()
    {
        !$this->_time && $this->_time = time();
        return $this->_time;
    }
 }
  
    /*
         * pv思路
         * ==按天統計==
         * r->zdd(天,時間戳,url:sid) ;
         * 統計今天的pv數:r->zcard(今天) return int;
         * 統計某天某個時間段的pv個數 r->zcount(天,時間戳開始,時間戳結束) return int;
         * 統計某個時間段的pv詳細數據 r->zrangebyscore(天,開始時間戳,結束時間戳) return array;如果是月的需要另算>10天>mysql,統計
         * ==按url統計pv==
         * $_redis->zadd(url,時間戳,$ip.'::'.$sid));//value值暫時沒有想法
         * 統計某個url的pv數:r->zcard(url) return int;
         * 統計某個url某個時間段的pv個數 r->zcount(url,時間戳開始,時間戳結束) return int;
         * 統計某個時間段的pv詳細數據 r->zrangebyscore(url,開始時間戳,結束時間戳) return array;如果是月的需要另算>10天>mysql,統計
         * ==策略==
         * 主庫負責插入操作
         * 從庫1負責備份和查詢。
         * 從庫1負責數據到mysql的工作。
         * 從庫2負責備
         *
     *
     */
 
?>

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM