1

現在、ビューカウンターを含む会員制サイトを開発中です。過去の経験によると、SQL でビュー カウンターを使用するとコストがかかります。実際、私はビューカウンターを避けていましたが、今日ではオプションではありません.

プロジェクトが使用する

  • レール 4.0.2
  • Redis オブジェクトの宝石
  • Redis To Goデモンストレーションのために、プラグインでHerokuを使用したいと考えています
  • 現在、カウンタは PG ( Active Record ) に基づいています。
  • Redis オブジェクトは AR でカウントするために使用されています (ただし、AR プロファイル テーブルに保存する方法は?)

ニーズ・実現への想い

  • Redis でカウントし、おそらく Rake + スケジュール タスクを使用して定期的に PG テーブルに保存します
  • 効率

問題

  • Redis DB にクエリを実行してすべての Profile オブジェクトを検索する方法がわかりません。

このオブジェクトのリストを取得できれば、rake タスクを記述して各項目を反復処理し、モーダル値をデータベースに保存/更新できます。

データベースに保存されているすべてのプロファイル値を取得するには、検索KEYS profile:*が唯一の方法であるように思われます。それから、手動でオブジェクトを取得して値を更新する必要があります。

質問

  1. keysキーを見つけてから、1 日 1 回、スケジュールされたタスクで (効率の観点から) 使用するのに適したオブジェクトを見つけるために使用しています。
  2. でできるように、すべてのProfileオブジェクトを Redis db から直接取得する方法はありますか?Profile.allActiveRecord
  3. カウンターを実装するための提案は大歓迎です (Redis ベースでなくても)

-

class Profile < ActiveRecord::Base

  # To handle the profile counter
  include Redis::Objects
  counter :tviews

  # Associations

  belongs_to  :user

  # Other attributes
end

profile_controller.rb

class ProfilesController < ApplicationController

  def public 
    @profile.tviews.increment
    # @profile.save # Save of AR based counting
  end

end

スリムで

    p.text-center#profile-counter
      | Views - 
      = @profile.tviews.value + @profile.views
4

1 に答える 1

1

1) いいえ、そうではありません。それが言うredisドキュメントを参照してくださいTime complexity: O(N) with N being the number of keys in the database, under the assumption that the key names in the database and the given pattern have limited length.

redis はすべてのキーを反復処理する必要があるだけでなく、キーをメモリに保存する必要があります。また、redis のシングルスレッドの性質により、keys コマンドの実行時に応答しなくなります。

2) ここでは Ruby ユーザーではありませんが、そうではないと思います。

3) いくつかのオプションがあります

  • キーの ID を redis に保存setし、定期的なタスク (および必要に応じて redis トランザクション) でクリーンアップします。このようにして、どのキーが redis にあるかを常に正確に知ることができます。
  • redis 2.8 のSCANコマンドを使用します。限られた量のキーのみを返し、内部カーソルを使用してキーを反復処理します。

(現在 redis.io がダウンしているようで、リンクが機能していない可能性があります)

于 2014-03-06T16:06:00.253 に答える