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负责备
*
*
*/ ?>

使用redis做pv、uv、click统计的更多相关文章

  1. 实时统计每天pv,uv的sparkStreaming结合redis结果存入mysql供前端展示

    最近有个需求,实时统计pv,uv,结果按照date,hour,pv,uv来展示,按天统计,第二天重新统计,当然了实际还需要按照类型字段分类统计pv,uv,比如按照date,hour,pv,uv,typ ...

  2. 有关“数据统计”的一些概念 -- PV UV VV IP跳出率等

    有关"数据统计"的一些概念 -- PV UV VV IP跳出率等 版权声明:本文为博主原创文章,未经博主允许不得转载. 此文是本人工作中碰到的,随时记下来的零散概念,特此整理一下. ...

  3. 日志分析_统计每日各时段的的PV,UV

    第一步: 需求分析 需要哪些字段(时间:每一天,各个时段,id,url,guid,tracTime) 需要分区为天/时 PV(统计记录数) UV(guid去重) 第二步: 实施步骤 建Hive表,表列 ...

  4. redis做RDB时请求超时case

        近期在排查redis做rdb时会有部分请求超时的case.初步推断是我们redisserver上开启了THP(Transparent Huge Pages).      1) Linux本身的 ...

  5. 网站流量分析指标-PV/UV/PR/ip分析及区别

    1.什么是pv? PV(page view),即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标. 高手对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你 ...

  6. 网站流量分析指标-PV/UV/PR/IP

    网站数据分析,经常会统计一个页面或者一个网站或者其他情况的PV/UV.下面简单说一下,这些量PV/UV/PR/IP. 1.PV PV(page view),即页面浏览量,或点击量.通常是衡量一个网络新 ...

  7. Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流

    1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...

  8. RabbitMq、ActiveMq、Kafka和Redis做Mq对比

    转载自:https://blog.csdn.net/qiqizhiyun/article/details/79848834 一.RabbitMq RabbitMQ是一个Advanced Message ...

  9. 大数据学习day34---spark14------1 redis的事务(pipeline)测试 ,2. 利用redis的pipeline实现数据统计的exactlyonce ,3 SparkStreaming中数据写入Hbase实现ExactlyOnce, 4.Spark StandAlone的执行模式,5 spark on yarn

    1 redis的事务(pipeline)测试 Redis本身对数据进行操作,单条命令是原子性的,但事务不保证原子性,且没有回滚.事务中任何命令执行失败,其余的命令仍会被执行,将Redis的多个操作放到 ...

随机推荐

  1. 修改hosts文件解决OneDrive被墙的问题

    增加如下内容就可以了.如果不知道修改hosts文件的具体方法请自行百度. 134.170.108.26 onedrive.live.com 134.170.108.152 skyapi.onedriv ...

  2. Deep Learning 学习笔记——第9章

    总览: 本章所讲的知识点包括>>>> 1.描述卷积操作 2.解释使用卷积的原因 3.描述pooling操作 4.卷积在实践应用中的变化形式 5.卷积如何适应输入数据 6.CNN ...

  3. csu oj 1811: Tree Intersection (启发式合并)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1811 给你一棵树,每个节点有一个颜色.问删除一条边形成两棵子树,两棵子树有多少种颜色是有 ...

  4. drop,truncate与delete的区别

    注意:这里说的delete是指不带where子句的delete语句 相同点 truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 d ...

  5. 开机自动播放音乐的vbs

    今天无意间看到了vbs这小玩意,就突发奇想,自学了一下,倒弄出如下的小玩意,大牛勿喷!这个可用做撩妹神技也可以用于提醒自己!使用方法:复制程序到txt文本里面保存,然后改后缀为vbs,丢到C:\Pro ...

  6. POJ2503——Babelfish

    Description You have just moved from Waterloo to a big city. The people here speak an incomprehensib ...

  7. Castle 开发系列文章

    转自:http://terrylee.cnblogs.com/archive/2006/04/28/castl_ioc_article.html Castle是针对.NET平台的一个开源项目,从数据访 ...

  8. 集合类 Contains 方法 深入详解 与接口的实例

    .Net 相等性:集合类 Contains 方法 深入详解 http://www.cnblogs.com/ldp615/archive/2009/09/05/1560791.html 1.接口的概念及 ...

  9. MySQL alter

    1:删除列 ALTER TABLE [表名字] DROP [列名称] 2:增加列 ALTER TABLE [表名字] ADD [列名称] INT NOT NULL  COMMENT '注释说明' 3: ...

  10. (1)html开头解说与案例演示

    看完后也可以参考http://www.cnblogs.com/csxiaoyu/p/5228889.html http://www.cnblogs.com/zfc2201/p/5429252.html ...