文章浏览量用什么做好呢,网上找了些方法感觉都不太好,按session,按cookie,按点击次数都有,想问问大神们怎么设计更合理,用的php
谢谢大家的热心回答!
文章ID 为key
比如$key = article:1
然后写入redis
定期跑脚本 落地到mysql
如果对数据要求不高,那就cookie 同一个浏览器算1次,然后数据存储到redis
刷新一次更新一次很容易被恶意刷量,数据库也容易被攻击.
可以考虑同一个IP在一段时间内(比如一天)的访问只算一次.
也就是更新文章阅读次数前,先查找当前用户IP是否在1天内访问过.
如果没有,则执行UPDATE更新阅读数加1,并且INSERT插入一条"文章ID+IP+时间"记录.
写的时候可以先写到Redis中,然后每隔一段时间后获取互斥锁写入MySQL.$redis->set('post_views_1024', $redis->get('post_views_1024')+1);
如果文章阅读次数最后更新时间超过600秒,则写入MySQL:
if( (time()-600) > $redis->get('post_views_last_update_time_1024') ) {
$key = 'lock'; //锁
$random = md5( uniqid(getmypid().'_'.mt_rand().'_', true) ); //随机值
$ttl = 10; //nx表示not exists.ex表示expire.ttl表示超时时间time to live,单位是秒.
if( $redis->set($key, $random, ['nx', 'ex' => $ttl]) ) { //加锁
//写入MySQL
$mysqli->query('UPDATE posts SET views = '.$redis->get('post_views_1024').' WHERE id = 1024');
if( $mysqli->affected_rows === 1 ) {
$redis->set('post_views_last_update_time_1024', time());
}
//加入随机值判断是为了避免删除到其他操作的锁
if($redis->get($key) == $random) {
$redis->del($key);
}
}
}
浏览量最普遍的计算方式就是文章的打开次数,基本上涉及到浏览量的文章刷新页面浏览量就会增加1
可以考虑用脚步解析ngnix或httpd的日志文件