java redis 实现pv uv_使用redis做pv、uv、click统计

本文介绍了如何使用Redis来实时统计网站的PV(页面浏览量)、UV(独立访客数)和Click(点击数)。通过前端生成urlid,后端存储和查询数据,以及定时将数据存入关系数据库。主要使用了Redis的键值存储功能进行统计,并提供了相关的Java代码示例。
摘要由CSDN通过智能技术生成

redis实时统计

设计思路:

1、 前端smarty插件(smarty_function_murl),将网站所有的连接生成一个urlid,后端根据获取的参数将需要的数据存入redis。

2、后端插件(smarty_function_aurl),将urlid传入redis获取数据。

3、定时将数据跑出来存入关系数据库,清除redis记录

缩减开支事业部没了,编入其它组织了,这个东西我就停工了,分享下思路和代码。

/**

* 返回 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负责备

*

*

*/

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值