3

私はEコマースRailsアプリケーションを持っており、レポート上の理由から、過去1年以内に顧客からの注文をページに出力する必要があります。現在、データセットは非常に大きく、これらの注文を1ページに表示するにはかなりのSQL処理が必要です。このタスクは最初は非常に遅かったので、必要な注文の詳細をすべてRedisサーバーに移動し、データのフェッチが非常に高速になりましたが、まだ十分ではありません。

これが私たちが持っているものです:

Rendered **path**/sales_orders.html.haml within layouts/admin (39421.1ms)
Completed 200 OK in 44925ms (Views: 39406.8ms | ActiveRecord: 417.2ms)

アプリケーションはHerokuでホストされており、リクエストに30秒以上かかると、リクエストは強制終了されます。ご覧のとおり、私たちはその制限をはるかに超えています。ほとんどの場合、ビューのレンダリングで失われます。

このページには、ユーザーが注文を選択する日付範囲を選択できる日付フィルターが含まれています。したがって、日付範囲は毎回変更される可能性があるため、キャッシュは理想的なソリューションではありません。

これをどのように行うことができるかについてのアイデアはありますか?

Redisキーの形式は次のとおりです(以下はRedisハッシュです)。

orders:2012-01-01:123
orders:yyyy-mm-dd:$order-id

ユーザーが日付範囲を指定するだけで、orders名前空間の下でその日付範囲内のすべてのキーを取得します。

たとえば、Redis注文キーから顧客名を取得する方法は次のとおりです。

= REDIS.hget(order_key, "customer_name")
4

3 に答える 3

2

ほとんどの時間はビューのレンダリングに費やされます。これはおそらく、多くのパーシャルまたはその他の複雑なビュー ロジックがあることを意味します。オプションのいくつかは次のとおりです。

  1. 出力にページ付けしますが、ページ付けされていない出力には PDF または CSV を提供します。
  2. ビューロジックを簡素化します...たくさん。
  3. 複雑なテーブルやネストされたパーシャルをレンダリングする代わりに、サイクルのようなヘルパーを試してください。
  4. JSON と JavaScript を使用してレンダリングをクライアントに移動します。

それだけです、本当に。それらの 1 つまたは複数で必要な場所に到達できない場合は、要件を再検討する時期かもしれません。

于 2012-06-15T07:24:36.503 に答える
2

Heroku Schedulerアドオンを使用して、定期的なタスクでレポートを作成することを検討してください。土壇場での注文をレポートに含める必要がない限り、毎晩レポートを作成し、すぐにダウンロードして朝のコーヒーと一緒に読んだり、郵送することもできます。彼ら。)

レポートの期間をインタラクティブに選択する必要がある場合は、リクエストをキューに入れ、バックグラウンド ジョブを使用してレポートを作成する必要があります。

于 2012-06-15T08:46:13.580 に答える
2

フラグメントキャッシュを使用することをお勧めします。フラグメントの読み取りは非常に高速 (~0.5 ミリ秒) であり、私の経験では、パーシャルを何度も再レンダリングしないことで大幅なスピードアップが得られることがわかります。また、Rails がフラグメントの無効化を処理し (モデルをキャッシュ キーの一部として使用する場合)、テンプレートの変更を最小限に抑える必要があるため、かなり安価なソリューションです。つまり、解決策は次のように簡単です。

<% @orders.each do |order| %>
  <% cache ["v1", order] do %>
    <%= render order %>
  <% end %>
<% end %>
于 2012-06-15T07:59:49.323 に答える