Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

Shopify/response_bank

Simple response caching for Ruby applications

Shopify/response_bank.json
{
"createdAt": "2008-04-21T18:25:42Z",
"defaultBranch": "main",
"description": "Simple response caching for Ruby applications",
"fullName": "Shopify/response_bank",
"homepage": "http://www.shopify.com",
"language": "Ruby",
"name": "response_bank",
"pushedAt": "2025-10-24T18:32:23Z",
"stargazersCount": 136,
"topics": [],
"updatedAt": "2025-10-10T12:19:52Z",
"url": "https://github.com/Shopify/response_bank"
}
  • Serve gzip’d content
  • Add ETag and 304 Not Modified headers
  • Generational caching
  • No explicit expiry

This gem supports the following versions of Ruby and Rails:

  • Ruby 2.7.0+
  • Rails 6.0.0+
  1. include the gem in your Gemfile

    gem 'response_bank'
  2. add an initializer file. We need to configure the acquire_lock method, set the cache store and the logger

    require 'response_bank'
    module ResponseBank
    LOCK_TTL = 90
    class << self
    def acquire_lock(cache_key)
    cache_store.write("#{cache_key}:lock", '1', unless_exist: true, expires_in: LOCK_TTL, raw: true)
    end
    end
    end
    ResponseBank.cache_store = ActiveSupport::Cache.lookup_store(Rails.configuration.cache_store)
    ResponseBank.logger = Rails.logger
  3. enables caching on your application

    config.action_controller.perform_caching = true
  4. use #response_cache method to any desired controller’s action

    class PostsController < ApplicationController
    def show
    response_cache do
    @post = @shop.posts.find(params[:id])
    respond_with(@post)
    end
    end
    end
  5. (optional) set a custom TTL for the cache by overriding the write_to_backing_cache_store method in your initializer file

    module ResponseBank
    CACHE_TTL = 30.minutes
    def write_to_backing_cache_store(_env, key, payload, expires_in: nil)
    cache_store.write(key, payload, raw: true, expires_in: expires_in || CACHE_TTL)
    end
    end
  6. (optional) override custom cache key data. For default, cache key is defined by URL and query string

    class PostsController < ApplicationController
    before_action :set_shop
    def index
    response_cache do
    @post = @shop.posts
    respond_with(@post)
    end
    end
    def show
    response_cache do
    @post = @shop.posts.find(params[:id])
    respond_with(@post)
    end
    end
    def another_action
    # custom cache key data
    cache_key = {
    action: action_name,
    format: request.format,
    shop_updated_at: @shop.updated_at
    # you may add more keys here
    }
    response_cache cache_key do
    @post = @shop.posts.find(params[:id])
    respond_with(@post)
    end
    end
    # override default cache key data globally per class
    def cache_key_data
    {
    action: action_name,
    format: request.format,
    params: params.slice(:id),
    shop_version: @shop.version
    # you may add more keys here
    }
    end
    def set_shop
    # @shop = ...
    end
    end

ResponseBank is released under the [MIT License]!(LICENSE.txt).