send_data でレンダリングしている画像をキャッシュしたい。
画像をDBにバイナリ保存している。
ビュー側ではimage_tag( url_for())で画像毎にリクエストして、インラインでsend_dataしている。
ページに複数の画像があっても、1画像毎にリクエスト→send_data→レンダリングとするしか方法が無いらしい。
ページに大量に画像があると、それだけ遅くなる。例えば10000画像とかある場合・・・。
そこをうまいことキャッシュする方法を試したい。
Chache-ControlとLast_Modifiedをうまいことして、proxyサーバーを経由させるとか情報あり。未確認。
Aamazon S3 にDB外出しが一番よさそう。やってみたい。
まずは、memcachedでどれだけ早くなるかを試すべきか?
参考サイト
①send_dataを使った一番シンプルな実装とキャッシュ検討
http://rubyist.g.hatena.ne.jp/rochefort/20100207/p1
※コメント欄にある方法、興味あり。以下、引用
画像モデルにcreated_at, updated_atを付けておいた上で 1. public/images/hoge/以下に画像ファイルがなかったらDBからバイナリを取って画像を出力する(File.utime()必要)。 2. 画像ファイルがあったらDBからupdated_atだけ引いて比較する。DBの方が新しい場合はファイルを上書きする(File.utime()必要)。 3. 画像ファイルのURLパスを返す。ってのを実行するimage_path()ってhelperを作る。 これだと、httpdに画像を任せられて速いし、DBに負荷が余りかからないし、分散環境でも問題ない。
①railsサーバー内でのキャッシュする方法と、S3と連携する方法
http://soplana.hateblo.jp/entry/%E2%96%A0
②PaperClip経由でS3と連携する方法
http://www.aguuu.com/archives/2012/12/paperclip/
http://www.func09.com/wordpress/archives/674
③proxyサーバーを経由する方法
http://d.hatena.ne.jp/sakusan_net/20080411/1207932815
[2013.07.03]追記
caches_action :get_image でできた。めちゃ簡単。
次はリクエストが来るのを防ぎたい。