Jets Caching
Important: These docs are for the outdated Jets 5 versions and below. For the latest Jets docs: docs.rubyonjets.com
Jets supports Fragment Caching. Jets uses the same ActionController::Caching
module underneath the hood as Rails. So, it supports pretty much the same Fragment caching as Rails. Referring the Caching with Rails Guide can help understand more ways to use the cache. We’ll cover some basic examples here.
Enabling
config/environments/development.rb
Jets.application.configure do
if Jets.root.join("tmp/caching-dev.txt").exist?
config.jets_controller.perform_caching = true
config.cache_store = :memory_store
end
end
The starter development.rb config allows you to turn on caching with
touch tmp/caching-dev.txt
Fragment Caching
Here’s a simple example.
app/views/products/index.html
<% @products.each do |product| %>
<% cache product do %>
<%= render product %>
<% end %>
<% end %>
To test, change the product directly with jets dbconsole
or a DB client and refresh. You’ll see that the fragment is cached.
If you update the product with the edit and update action, the cache will expire automatically. If you update the record with jets console
, the cache will also automatically expire. The cache expiration happens at a model callback level.
Low-Level Caching
Sometimes, you need to cache lower-level values. You can use Jets.cache
directly in this case.
class Product < ApplicationRecord
def competing_price
Jets.cache.fetch("#{cache_key_with_version}/competing_price", expires_in: 12.hours) do
Competitor::API.find_price(id)
end
end
end
Cache Storage and VPC
Jets Caching supports all the same Cache Stores as Rails Caching. See Rails Cache Stores.
In real-world practice, the main Cache Stores I’ve used with Rails have been MemCacheStore and RedisCacheStore. This is because these storages allow you to manage and expire the cache centrally. Unlike the FileStore, which could be stored on any server or any of the warmed-up Lambda functions in the AWS Lambda case.
For AWS ElastiCache Memcached and Redis, both only expose an internal network endpoint. This means you have to configure your Lambda function to use a VPC to use them. There are some pros and cons with VPC enabled Lambda functions.
Future Improvements
- Action and Page Caching are not supported yet. Rails provides these in these separate gems: rails/actionpack-action_caching and rails/actionpack-page_caching. It would essentially be ports of those gems.
- Currently, the
config.enable_fragment_cache_logging = true
is not respected. We want to fix this and figure out why the LogSubscribers are not firing with Jets. - We’ll also review and consider PRs.