您的位置:首页 > 运维架构 > 网站架构

网站点击量统计,如何利用缓存实现点击量统计

2014-10-31 15:23 260 查看
小弟刚工作1个多月,也是初次写博客,希望与大家分享分享,本文如有不对的地方、语句不通顺的地方、不符合逻辑的地方、很二的地方、希望各位大神能够多多包含并指出,谢谢!

小弟初学Laravel框架 也是初学PHP 小弟创建了一个群 希望和大家一起学习讨论 欢迎大家的加入群号:296177986

大家都知道目前没有哪一种语言的缓存技术能够在缓存失效时进行捕捉,可能很多人都觉得没有必要,或许是我的知识面还不够广,没有发现实现点击量统计更好的方法。

以新闻网站为例,分析如下:

我们要缓存点击量,肯定是将新闻ID和点击次数存到(数组,集合...)等等,看大家习惯,如果你想没30分钟更新一次到数据库,请问你怎么判断30分钟一到就更新到数据库呢?(那么问题来了,敢问挖掘机技术哪家强?)大家别忘了 缓存没有像类一样的析构函数(表示没用过 -_-!),无法让他失效的时候执行更新点击量的代码代码。

既然这样我们可不可以自己判断呢?

实现步骤(该具体步骤针对PHP):

网站首次上线,当第一个用户点击新闻的时候,我们新建一个永久性缓存 在缓存中存一个数组,数组的第一个值对就是 缓存起始时间 如:$cache_click['cache_time']=time();

当第N个用户点击时,判断$cache_click['cache_time'] + 30分钟 小于 当前时间时 我们就执行更新,更新完成后 将$cache_click 数组清空 并且 重新赋值$cache_click['cache_time']=time(); 然后存入缓存,好了不多说了,估计越说大家越乱(我也乱了),看代码好了 PHP Laravel框架的代码

//点击量缓存
public function  click($newsid)
{
//缓存多久  这里是指30秒
       $time_update = 30;
//用来存储
$click_cache = array();

//判断缓存是否存在
if(Cache::has("NewsCenter_click_cache"))
{
//如果存在取出缓存数据
$click_cache=Cache::get("NewsCenter_click_cache");
}
else//如果不存在
{
//存入首次缓存时间
$click_cache["cache_time"] = time();
//添加进缓存     永久性缓存
Cache::forever("NewsCenter_click_cache",$click_cache);
//终止执行
return;
}

//判断缓存内是否已经存在$newsid的键值
if(array_key_exists($newsid,$click_cache))
{
//存在  就在值上面加 1
$click_cache[$newsid] = (int)$click_cache[$newsid]+1;
}
else
{
//不存在给默认值 1
$click_cache[$newsid] = 1;
}

//获取上次缓存的时间
$last_cache_time = (int)$click_cache["cache_time"];
//如果上次缓存时间加上过期时间    小于当前时间   说明缓存要过期
if($last_cache_time+$time_update<time())
{
//缓存过期 将缓存的点击量更新到数据库 并且清除缓存
foreach($click_cache as $key_newid=>$val_click)
{
//这样判断是因为数组中存的第一个是 cache_time的键值 必须排除掉
if($key_newid!="cache_time")
{
//通过新闻ID找到对应model
$news = HTNewsInfo::find($key_newid);
if($news!=null)
{
//用新闻原点击量加上缓存的点击量
$new_click_count = $news['attributes']['CLICK_COUNT']+$val_click;
//最新点击量加上原点击量 更新到数据库
DB::update('update HT_NEWS_INFO set CLICK_COUNT = ? where NEWSID = ?', array($new_click_count,$key_newid));
}
}
}
//更新数据库完成后清除数组中的数据       并填充到缓存
$click_cache=null;
$click_cache["cache_time"] = time();
Cache::forever("NewsCenter_click_cache",$click_cache);
}
else
{
Cache::forever("NewsCenter_click_cache",$click_cache);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: