redisを使用してpv、uv、click統計を作成する
4910 ワード
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
*
*
*/
?>