この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
よく閲覧されるページで何度もDBを読み込むのは、負荷がかかったりしていいとは言えません。 なのでキャッシュ処理を使用して、DBアクセスを減らしサクサク動けるようにしたいです。 そこでRailsでは容易にキャッシュ処理ができるのでやってみました。
class BlogController < BaseController
before_action :load_paper, :load_picture, only: [:show]
# キャッシュの保有期間を設定
CACHE_EXPIRE_TIME = 1.day.freeze
def show
・・・・・
end
private
def load_paper
# Rails.cache.readで読み込む
@papers = Rails.cache.read(cache_key(:paper))
# なかったらRails.cache.writeで書き込む
unless @papers
@papers = Paper.all
Rails.cache.write(cache_key(:paper), @papers, expires_in: CACHE_EXPIRE_TIME)
end
end
def load_picture
@pictures = Rails.cache.read(cache_key(:picture))
unless @pictures
@pictures = Picture.all
Rails.cache.write(cache_key(:picture))
end
end
# keyが被らないようにする
def cache_key(type = nil)
[
self.class.name.underscore,
type
].join('')
end
end
メソッド化などをしなければキャッシュ処理は3~4行追加するだけでできるので非常に便利です。
またRails.cache.fetch
を使用するとさらに短くなります。fetch
はキャッシュがあったらそのまま返し、なかったらキャッシュを生成して返すという処理が行われます。
def load_paper
@papers = Rails.cache.fetch(cache_key(:paper), expires_in: CACHE_EXPIRE_TIME) do
Paper.all
end
end
翻訳されてないですが、RailsGuidesで詳しく載っているのでこちらを見るのもいいかもしれないです。