Your SlideShare is downloading. ×
Caching strategies in Rails 4
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Caching strategies in Rails 4

1,236
views

Published on

Published in: Technology

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,236
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Key-basedcacheexpirationin Rails4 ...or Rails 3 with a dependency Wednesday, July 31, 13
  • 2. BuildingBlocks(ActiveRecord::Base) @product.cache_key =>“products/1281-20130717091609” “#{name}/#{id}-#{timestamp}” Wednesday, July 31, 13
  • 3. BuildingBlocks (ActionView::Helpers::CacheHelper) - cache @product do %h1= @product.name = image_tag @product.image.url Wednesday, July 31, 13
  • 4. Write fragment views/products/1-20130728191246157664000 (“views/#{cache_key}”) - cache @product do %h1= @product.name = image_tag @product.image.url Wednesday, July 31, 13
  • 5. Youcancomposefragmentkeys,too... - cache [@product, “reviews”] do %h1= @product.name = image_tag @product.image.url Write fragment views/products/1-20130728191246157664000/reviews “views/#{cache_key}/#{extra_args.join(‘/’)}” Wednesday, July 31, 13
  • 6. “ButwhatifI change atemplate?” Wednesday, July 31, 13
  • 7. Rails.cache.clear Wednesday, July 31, 13
  • 8. “ButwhatifI deploy5times aday” Wednesday, July 31, 13
  • 9. sucks Wednesday, July 31, 13
  • 10. Justkidding!™ Wednesday, July 31, 13
  • 11. # Gemfile gem ‘pg’ gem‘cache_digests’ gem ‘haml-rails’ gem ‘cancan’ # ... (Rails 3 only – built into actionpack 4) Wednesday, July 31, 13
  • 12. Write fragment views/products/1-20130728191246157664000/3b2b93d56d331aa7a1bf9267a656d3c9 (“views/#{cache_key}/#{template_digest}”) - cache @product do %h1= @product.name = image_tag @product.image.url Withcache_digests... note: template_digest is a digest of the current template and all of it’s dependencies (more on that later) Wednesday, July 31, 13
  • 13. Cache digest for products/_product.html: 42eb891316f21e68798de5d5aa8021d5 Read fragment views/products/1-20130728191246157664000/42eb891316f21e68798de5d5aa8021d5 Write fragment views/products/1-20130728191246157664000/42eb891316f21e68798de5d5aa8021d5 - cache @product do %h1= @product.name - # image_tag @product.image.url ...changethetemplate Wednesday, July 31, 13
  • 14. templatechange ->newdigest ->newfragmentkey ->bustedcache! Wednesday, July 31, 13
  • 15. Andwedidn’t havetodo anything! Wednesday, July 31, 13
  • 16. “Russiandoll”cachingstrategy thenotorious Wednesday, July 31, 13
  • 17. class Product < ActiveRecord::Base has_many :reviews end class Review < ActiveRecord::Base belongs_to :product, touch: true end Product’s cache key now dependent on its reviews Wednesday, July 31, 13
  • 18. @review.update!(rating: 3) @review.product’s key gets bumped as well Wednesday, July 31, 13
  • 19. the “russian doll”... # products/index.haml - cache [@products.order(“updated_at ASC”).last, “index”] do %ul.products - @products.each do |product| = render product # products/_product.haml - cache product do %li.product %h1= product.name %h2 Reviews! %ul.reviews - product.reviews.each do |review| = render review # reviews/_review.haml - cache review do %li.review %h4= “#{review.rating} stars!” %p.content= review.content Wednesday, July 31, 13
  • 20. the “russian doll”... index product reviews list review review review Wednesday, July 31, 13
  • 21. @product.reviews.last.update!(rating: 5) Last review will get re-rendered (and cached) and container (review list) will get busted - but when list re-renders all but this last review can be fetched from cache. Wednesday, July 31, 13
  • 22. View the template dependency tree... $ rake cache_digests:nested_dependencies TEMPLATE=your/template/name ex: and rake task for Rails 4: https://gist.github.com/nzaillian/6127613 Wednesday, July 31, 13
  • 23. Explicit dependency If Rails just can’t seem to figure out your dependency you can declare an explicit dependency in a template by including a comment with a special form: - # Template Dependency: reviews/summary (...but you shouldn’t ever have to do this) Wednesday, July 31, 13
  • 24. OtherResources https://github.com/rails/cache_digests http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works http://www.youtube.com/watch?v=yhseQP52yIY&t=0:39:39 mustwatch!(DHH’sRailsconf2013outlineofkey-basedcaching) http://api.rubyonrails.org/classes/ActionView/Helpers/CacheHelper.html Wednesday, July 31, 13