在项目中,一般文章的浏览量,是需要频繁的更新的,用户每点进来一次,即为浏览了一次,如果是像大型点的博客类网站,点击量非常多,每一次都要进行mysql 操作,服务器压力很非常大,mysql服务有可能会崩溃,所以,我们为了实现这个频繁更新的访问量小功能,可以使用redis来实现 ~
具体实现方法:
利用redis的hash类型,进行存储数据,key为cli,filed 为文章的id,value 为文章的浏览量,$redis->hIncrBy('cli',$data['id'],1); hIncrBy 是自增作用,用户每浏览一次,增加一次浏览量,所有的文章的浏览量都会存储在一个hash里,我们需要做一个定时任务,创建一个接口,接口的内容是:将保存浏览量的hash数组全部更新到Mysql里, 每天夜晚执行一次。
以下是代码(使用的是tp5.1框架):
public function product()
{
$redis = new \Redis();
$redis -> connect('127.0.0.1',6379);
$id = input();
$data = NewsModel::newProduct($id[0]); //调用模型查出新闻详情
if(!$redis->hGet("cli",$data['id'])){ //如果没有缓存
$redis->hSet("cli",$data['id'],$data['click']);
}
$cli = $redis->hIncrBy('cli',$data['id'],1); //hash自增
$vv = $redis->hSet("cli",$data['id'],$cli); //将自增后的值更新进redis
$data['click'] = $cli; //自增后的数据展示给前端
$tui = NewsModel::newTuiJian($id[0]); //推荐文章
$this->assign('data',$data);
$this->assign('tui',$tui);
return $this -> fetch('product');
}
下面是接口方法(将redis数据更新进mysql):
public function upMysql() //接口:将redis数据更新进mysql
{
$redis = new \Redis();
$redis -> connect('127.0.0.1',6379);
$data = $redis->hgetall("cli"); //取出存在redis里的全部数据
foreach ($data as $key=>$val){ //循环将每条数据更新进mysql
$data = Db::name('store_news') ->where('id',$key) -> update(['click'=>$val]);
}
}