几乎每家社交网站和视频网站都广泛的应用了计数器功能(点赞,顶/踩),尤其热门消息的时候计数器增长更是成倍增长。通常的解决方案就是存入 Redis 中,再定时持久化到关系型数据库中(MySQL)。
## 写入计数器
~~~
public function addCount($video_id)
{
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$redis->incr("v:c:{$video_id}");
// $redis->incrBy("v:c:{$video_id}", 1);
// $redis->incrBy("v:c:{$video_id}", -1);
}
~~~
## 定时读取计数器
使用计划任务,每隔一段时间执行一次函数。ThinkPHP5 推荐使用自定义命令行工具。
~~~
public function AsyncWriteCount($video_id)
{
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$count = $redis->get("v:c:{$video_id}");
// ======================
// 写入数据库
// ======================
if (/* 写入数据库成功 */) {
$redis->set("v:c:{$video_id}", 0);
}
}
~~~
以上只是最简单的演示代码,实际项目中不会使用简单的字符串来做计数器,通常是列表或者有序集合