5

ユーザーが検索結果を閲覧するサイトを持っています。ユーザーが表示した結果を覚えておき、それらを としてマークすると便利ですViewed

問題:Recently Viewedこのようなリスト機能を実装するには、どのアプローチが推奨されますか?

  1. MySQL などの RDBMS を使用します。ユーザーがリンクをクリックするたびに、サーバーへの AJAX 呼び出しを開始して、viewsid, user_id, item_id,を含むテーブルに新しい行を挿入しますtimestamp。検索結果が表示される前に、各アイテムがidテーブルに対してチェックされviews、そのリストが としてマークされるかどうかが判断されviewedます。 (これが役立つ場合、私の PHP フレームワーク Laravel は、Cookie を使用する代わりに、セッション ドライバーとしてデータベースまたは redis を使用できます)

  2. Redis などのインメモリ データ ストアを使用します。redis/memcached の経験がありません。これを使用することを考えた理由は、viewedテーブルへの書き込みが多く、読み取りは主に主キーによって選択されるためです (Redis にインデックスの概念はありますか?)

特に 2 つのテクノロジの経験者からの提案や意見をお寄せいただきありがとうございます。

4

2 に答える 2

1

少なくとも、より包括的なコンテキスト(サーバーの負荷、アクセスの量、データの量、データベースの書き込みと読み取りの比率など)がなければ、言及するテクノロジーから選択する際の経験則はありません。それらはすべて他のものよりも「優れている」ものであり、単なる異なるツールです。

ページビューごとに1つのMySQLINSERTが、数万人の同時(つまり、まったく同時にサイトにアクセスする)ユーザーがいることを期待しない限り、パフォーマンスにわずかな影響を与える可能性はほとんどありません。私が提案するのは、MySQLに焦点を当てることです。これは、あなたが最もよく知っていることのように思われるからです。最終的にボトルネックになった場合は、後でいつでも別の方法に切り替えることができます。

そうは言っても、冒険心があり、時間が問題にならない場合は、次のようになります。

  • redisは、あなたがやろうとしていることに最適です。基本的に、スコアとしてタイムスタンプを持つitemidを含む、ユーザーごとにソートされたセットがあります。これは、取得が簡単で(user:$ userid:recentviewsなどのユーザーIDにちなんで各キーに名前を付ける)、ページ付けが簡単で(ZREVRANGEが最新のxビューを取得します)、期限切れが簡単です(ZREMRANGEBYRANKは0から現在のタイムスタンプ-30日より古いすべてのエントリを削除するには30日など)、MySQLカウンター部分と比較して比較的メモリ効率が高いはずです。これがすべてぎこちないように聞こえても心配しないでください。redisを習得すると、実際には非常に直感的になります。

  • Memcachedは、データストアとしてではなく、厳密にキャッシュとして設計されているため、データ型に少し柔軟性がありません(json文字列を保存し、必要に応じて解析/文字列化する必要があります。リストを最初に完全に取得せずに部分的に編集できないという不便な点もあります)。また、redisとは対照的に、データはディスクに保持されないため、最近のビューシステムにはお勧めしません。最近のビューデータが揮発性で小さい場合は適切かもしれませんが、memcachedがredisよりも大幅に高速であるとは思いません。

時間があれば、redisとmemcachedについて、それらが何であるか、どのように使用されているかがよくわかるまで、検索して読むことをお勧めします。そうして初めて、情報に基づいた決定を下すことができます。ただし、前述したように、ニーズが特別なものでない限り、MySQLはパフォーマンスの問題なしに問題なく機能する可能性があることに注意してください。

于 2012-10-17T11:44:49.107 に答える
0

私はこれに似たものを持っていますが、あなたが得ようとしているものにはうまくいくはずです. 各ページにファイルを含めて、アクセスしたページを保存することはできませんでした. 各ページに含まれるsession.phpファイルまたは同様のものがある場合は、次のコードをその中に入れることができます

$insert = mysql_query("INSERT INTO views VALUES
('$user_id','$itemid','$timestamp')");

(IDはデータベースで自動インクリメントする必要があります)

これにより、ページが挿入され、現在表示されている ID が表示されます。そのページでページ ID を定義する必要があります。のようなものを使用するので、私にとっては簡単ですprofile.php?id=1。次に、検索結果を表示する場所について..

$checkid = mysql_query("SELECT * FROM views WHERE user_id='$userid' & itemid='$itemid');
$views = mysql_num_rows($checkid);

if($views > 1){
$viewed = "false";
}else{
$viewed = "true";
}

次に、ページに次のような結果を表示します if($viewed = "true"){ echo "このページを $views 回表示しました"; }elseif($viewed = "false"){ echo "あなたはまだこのページを閲覧していません"; }

意味をなさないことに遭遇した場合は、私に教えてください。私はあまり睡眠をとっていません! ハハ (私は正確には PHP の達人ではありません)

于 2012-10-17T03:16:19.107 に答える