1

Rails アプリケーションに memcached を使用することを検討しています。会員検索での利用を検討していたのですが、検索のパラメータが複数あり、ユーザーの選択によって変化するので戸惑っています。

これは、検索のクエリの例です。

 @results = Painter.city(params[:city].downcase).state(params[:state]).tools(tools).transportation(trans).travel_distance(params[:travel_distance]).insurance(insurance).employee(emp).subcontractor(sub).available(true).paginate(:page => params[:page], :per_page => 20).where("premium = ? AND banned = ?", false, false).order('last_name')

これは memcached の有力な候補のようですが、確信が持てません。

方向を教えてください。

4

1 に答える 1

1

これは、Memcached を使用して確実にキャッシュできます。キャッシュキーのフォーマットを決定することから始めなければなりません.キャッシュレコードを一意に決定するいくつかの異なる基準/フィールドがある場合(あなたの場合のように)、おそらくいくつかを使用して、事前に決定された順序でそれらを連結することができますそれらを区切るための一種の文字列。たとえば、キャッシュ キーは次のようになります。

@results = Rails.cache.fetch([params[:city].downcase,
                   params[:state],
                   tools,
                   trans,
                   params[:travel_distance],
                   insurance,
                   emp,
                   sub,
                   params[:page]
                  ].join('/')) do
  Painter.city(params[:city].downcase)...  # rest of your query
end

フォーマットを微調整またはクリーンアップしたい場合がありますが、その要点は、一貫したキャッシュ キーを文字列として計算できる必要があるということです。複数のフィールドに対してこれを行う最も簡単な方法はjoin、区切り記号を使用することです (私は を選択/しましたが、必要に応じて他の区切り記号を使用できます)。

を省略したことにも注意してください:per_page => 20。これは、コントローラー コード内にハードコードされており、ユーザー入力に基づいて変化しないためです。返されるレコード数をユーザーがカスタマイズできるようにする場合は、キャッシュ キーにもそれを含める必要があります。where("premium = ? AND banned = ?", false, false)句についても同じことが言えavailable(true)ます。

Rails キャッシングは、元のソースから検索するのが重要なあらゆる種類のコンテンツ (つまり、DB クエリが含まれる場合) に使用できます。

もちろん、覚えておくべき非常に重要な考慮事項はキャッシュの有効期限です。キャッシュにあるデータの基準に一致する新しいレコードを DB に追加する場合は、キャッシュ内のデータを手動で期限切れにする必要があります。それ以外の場合は、キャッシュにアクセスしたときに自動有効期限を設定して、write最終的には自動的にパージおよび更新されるようにします。

Rails で Memcached を使用すると、手動でキャッシュを有効期限切れにすると、次の処理が行われdeleteます。

Rails.cache.delete(key)

または、自動有効期限を使用するには、次の:expires_inオプションを使用します。

Rails.cache.write(key, value, :expires_in => 1.minute)
于 2013-04-15T06:19:56.567 に答える