その他
    ホーム 技術発信 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で詳しく載っているのでこちらを見るのもいいかもしれないです。