ホーム DoRuby Rails.cacheでキャッシュ処理してみた
Rails.cacheでキャッシュ処理してみた
 

Rails.cacheでキャッシュ処理してみた

この記事はアピリッツの技術ブログ「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で詳しく載っているのでこちらを見るのもいいかもしれないです。

記事を共有

最近人気な記事