PHP+Redisを使って簡単にアクセスランキングを実装


ブログなどでよく見かけるアクセスランキング。
Redisを使えば以下の流れで簡単にアクセスランキングを実装することができます。

※2016/11/29追記 ライブラリ化しました!
https://github.com/YuzuruS/redis-ranking

packagistに登録もしてあるので、composerを使って簡単にインストールできます。

composer.json
{
    "require": {
       "yuzuru-s/redis-ranking": "1.0.*"
    }
}

PVカウントアップ

記事にアクセスがあったらzincrbyで一部日付を持ったキーのスコアをインクリメント

count.php
// 記事ID $article_id にアクセスがあったら、スコアをインクリメント
$key = date('Ymd') . ':article:pv';
$Redis->zincrby($key, 1, $article_id);

// keyが溜まり続けるので、1ヶ月後に削除する
$Redis->setTimeout($key, 60 * 60 * 24 * 30);

集計

1週間(もしくは1ヶ月)分のデータをzUnionで合算
アクセスランキングを作成します。
日時バッチ等で実行してください。

collect.php
// 1週間分のPVを集計
$keys = [];
for ($i = 1;$i <= 7;$i++) {
    $keys[] = date('Ymd', strtotime("-{$i} day")) . ':article:pv';
}
$Redis->zUnion('weekly_article_pv', $keys);

アクセスランキングの取得

zRevRangeでアクセスランキングを取得

getRanking.php
// アクセスランキングを取得
$ranking = $Redis->zRevRange('weekly_article_pv', 0, -1);