使用redis做pv、uv、click统计
2014-04-04 11:45
525 查看
redis实时统计
设计思路:
1、 前端smarty插件(smarty_function_murl),将网站所有的连接生成一个urlid,后端根据获取的参数将需要的数据存入redis。
2、后端插件(smarty_function_aurl),将urlid传入redis获取数据。
3、定时将数据跑出来存入关系数据库,清除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 关键 点
- redis内存相关配置conf
- Redis2.2.2源码学习——dict中的hashtable扩容和rehash
- Redis初试
- Redis千万级的数据量的性能测试
- redis数据丢失及解决
- Redis资料汇总专题
- 神奇的Redis
- Redis复制与可扩展集群搭建
- redis与spring的完全集成
- Maven中Spring-Data-Redis存储对象(redisTemplate)
- Java实现Redis持久化到数据库的关键方法
- 关于Redis延迟,不同系统下fork操作时间对比
- NoSQL数据库Redis(REmote DIctionary Server)使用介绍和特性
- Redis 事务实现分析
- Redis数据类型及其操作—Sorted sets
- Redis数据类型及其操作—Hashes
- Redis数据类型及其操作—Sets
- Redis数据类型及其操作—Lists
- mysql数据向Redis快速导入