幾乎每家社交網站和視頻網站都廣泛的應用了計數器功能(點贊,頂/踩),尤其熱門消息的時候計數器增長更是成倍增長。通常的解決方案就是存入 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);
}
}
~~~
以上只是最簡單的演示代碼,實際項目中不會使用簡單的字符串來做計數器,通常是列表或者有序集合