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. 求n个数中的最大或最小k个数

    //求n个数中的最小k个数        public static void TestMin(int k, int n)        {            Random rd = new Ra ...

  2. django1.77+mod_wsgi+python2.79+apache2.24 在阿里云centos部署攻略

    心平气和的记录一下今天 踩的坑以防万一 以后还踩 首先我今天的平台是在 阿里云上的一台纯净版的 centos6.5 64位主机上进行的 首先装python2.7 去官网下载python2.7安装包 然 ...

  3. C++builder XE10 终于支持类内变量初始化了

    Win32终于支持类内变量初始化了,C++11 用bcc32C编译器  llvm CLang.还支持Unicode 中文汉字 变量名. 用经典的bcc32编译还是不支持! class TPerson ...

  4. Spark RDD概念学习系列之RDD的5大特点(五)

      RDD的5大特点  1)有一个分片列表,就是能被切分,和Hadoop一样,能够切分的数据才能并行计算. 一组分片(partition),即数据集的基本组成单位,对于RDD来说,每个分片都会被一个计 ...

  5. Cocos2d-x 关于Android.mk 自动读入CPP

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  6. HTML5每日一练之OL列表的改良

    在HTML5中的OL被改良了,为它增加了两个新属性. start属性:start属性用来定义列表编号的起始位置,比如下面的代码,列表将从50开始51...55以此类推 <ol start=&qu ...

  7. Live m3u8播放3个文件自动停止问题

    Live m3u8播放3个文件自动停止问题 1.问题描述 最近做一个转码切片播放测试,使用HLS(HTTP Live Streaming)来做直播, 每个TS分片时间为10s,根据TS分片文件生成以下 ...

  8. iOS KVC/KVO/KVB

    看了那么多博客.描述那么复杂,其实KVC很简单,没描述的那么复杂,所以写一篇简单的易于理解的博文,切入正文: 1.KVC底层是通过runtime对method和value操作  比如说如下的一行KVC ...

  9. JS制作的简单的三级及联

    前台: <form id="form1" runat="server"> <div> 省 <select id="Pro ...

  10. 使用WSAIoctl获取socket扩展函数(如AcceptEx)的指针

    未获取函数指针就调用函数(如直接连接mswsock.lib并直接调用AcceptEx)的消耗是很大的,因为AcceptEx 实际上是存在于Winsock2结构体系之外的.每次应用程序常试在服务提供层上 ...