3

ユーザーはそれぞれユーザー プロファイルを持ち、誰が自分のプロファイルを閲覧したかを各ユーザーに知らせたいと考えています。これを実行する唯一の方法は、誰かがプロフィール ページを表示するたびに (おそらくページの最後で Ajax 呼び出しを使用して) データベースの INSERT を実行することです。これは、特にサイトがかなりのトラフィックを蓄積している場合、パフォーマンスに大きな問題があるように思えます.

パフォーマンスの高い方法でこれを達成する方法についてのアイデアはありますか、それともこの種のものを追跡することの性質ですか?

ありがとう。

4

2 に答える 2

4
  1. なぜ別のajax呼び出しを追加して表示するのですか?
    コントローラでユーザープロファイルshowaction..を呼び出すときに実行します

  2. バックグラウンドジョブにキューに入れます(例:starling + workling

  3. 表示されるデータにアシッドDBを使用しないでください。ある種のキー値ストアデータベース(cassandra、redisなど)を使用してください。

于 2010-01-07T17:01:52.833 に答える
3

MySQL を使用している場合、キーの競合がある場合に行を更新できる "INSERT INTO...ON DUPLICATE KEY" 機能を使用するのが大好きです。これは、プロファイル ビューごとに 1 行ではなく、ユーザー + プロファイルのペアごとに 1 行、またはさらに細分化するために、ユーザー + プロファイル + 1 日ごとに 1 行が存在する可能性があることを意味します。

トラフィックの状況と DB エンジンの選択によっては、これは長時間でも非常にうまく機能する場合があります。このような追跡テーブルには非常に多数の行が存在する可能性がありますが、コンテンツは非常に小さく、ID フィールドのペアと数値カウンターのように、エントリごとに 12 ~ 16 バイト程度です。

たとえば、追跡テーブルは次のように定義できます。

def self.up
  create_table :user_profile_views do |t|
    t.integer :user_id
    t.integer :profile_user_id
    t.integer :count, :default => 0
  end

  add_index :user_profile_views, [ :user_id, :profile_user_id ], :unique => true
end

モデルの場合:

def self.record_view_profile!(user, profile)
  connection.execute(sanitize_sql([ "
    INSERT INTO user_profile_views (user_id, user_profile_id, count)
      VALUES (%d,%d,1)
      ON DUPLICATE KEY UPDATE
       count=count+1
  ", user.id, profile.id ])
end

これにより、行が挿入されるか、既存の行のカウントが更新されます。

于 2010-01-07T16:30:36.457 に答える