Redisで記事のアクセスランキングを作りました。日間・週間・月間でランキングが見れるものにしました。
初めて作るのでノウハウがわかりません。どうかアクセスランキングのノウハウを教えていただければ幸いです。
今回は次のようなシステムを作りました。
- RedisのSorted-setを使用
- keyにYYYYmmddの形式で日付、menberに記事のID、scoreに閲覧回数をそれぞれ格納
- 記事にアクセスがあるたびにscoreをインクリメント
- 週間・月間ランキングのリクエスト:まずzrevrangebyscoreでweekly・monthlyキーを作る。zrevrangebyscoreで記事のIDリストを得る。IDリストをMariaDBに照合して記事の詳細を格納した記事リストを返す。
- 日間ランキングのリクエスト:日付のキーでzrevrangebyscoreして記事のIDリストを得る。MariaDBに照合して記事の詳細を格納したリストを返す。
以上のようなシステムを作りました。
ここで疑問なのが、週間・月間ランキングのリクエストがあるたびにzunionstoreやzrevrangebyscoreをしてMariaDBから記事の詳細を得ていくようなシステムはあまり良くないでしょうか?
やはり、バッチ処理で定期的にRedisからデータをMariaDBに移し、それを表示用に使ったほうがよいでしょうか?
他にいいアイデアがあればぜひ教えて下さい!
よろしくお願いいたします。
使用した技術:
- Redis
- MariaDB
- PHP
- Laravel
>Redisで記事のアクセスランキングを作りました。日間・週間・月間でランキングが見れるものにしました。
アプリケーションは完成しているのですね?
そのうえでアプリケーションを改善したいという質問でしょうか?
>システムはあまり良くないでしょうか?
何が良くないと思ったのでしょうか?
解決したい課題があっての質問なのですか?
課題を教えてください。
アプリはテスト段階ですが、完成に近い状態です。課題は、実際にユーザーに利用してもらう際に実用に耐えうるのか不安なところです。
今のシステムであまり良くないと思っているところは、月間・週間ランキングへのリクエストがあるたびにZUNIONSTOREで和集合を作り、ZREVRANGEBYSCOREでランキングを得てDBから記事のデータを引っ張ってくるところです。これではやや計算量がかかりすぎてしまうのではと考えています。
そこで、一般的にはどのように構築するのが良いのか知りたいです。
よろしくお願いいたします。
あなたの回答
tips
プレビュー