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 でできた。めちゃ簡単。

次はリクエストが来るのを防ぎたい。