Kickin' Ass with Cache-Fu (without notes)
Upcoming SlideShare
Loading in...5
×
 

Kickin' Ass with Cache-Fu (without notes)

on

  • 15,246 views

My memcached talk at RailsConf 2007 (without notes). See the blog post: http://errtheblog.com/post/4872

My memcached talk at RailsConf 2007 (without notes). See the blog post: http://errtheblog.com/post/4872

Statistics

Views

Total Views
15,246
Views on SlideShare
15,228
Embed Views
18

Actions

Likes
11
Downloads
241
Comments
4

2 Embeds 18

http://www.slideshare.net 17
http://webcache.googleusercontent.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • Excellent. You've shown your credibility on presentation with this slideshow. This one deserves thumbs up. I'm John, owner of www.freeringtones.ws/ . Perhaps to see more quality slides from you.

    Best wishes.
    Are you sure you want to
    Your message goes here
    Processing…
  • outstanding display..convinced me to have a hardlook at my company model..brilliant

    Janie
    http://financejedi.com
    http://healthjedi.com
    Are you sure you want to
    Your message goes here
    Processing…
  • cool stuff!
    Are you sure you want to
    Your message goes here
    Processing…
  • There's also a version with notes: http://www.slideshare.net/err/kickin-ass-with-cachefu/
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Kickin' Ass with Cache-Fu (without notes) Kickin' Ass with Cache-Fu (without notes) Presentation Transcript

  • CHRIS WANSTRATH ERR FREE [ http://errfree.com ]
  • 50,000,000 pages no downtime
  • memcached.
  • Memcaching Rails CHRIS WANSTRATH ERR FREE [ http://errfree.com ]
  • Memcaching Rails CHRIS WANSTRATH ERR FREE [ http://errfree.com ]
  • chris wanstrath railsconf 2007 kickin’ ass with cache-fu
  • {}
  • class Memcache < Hash undef :each, :keys end
  • class Memcache < DRbHash undef :each, :keys end
  • $ memcached -vv <3 server listening <7 new client connection <7 get app-test:Story:1 >7 END <7 set app-test:Story:2 0 >7 STORED <7 delete app-test:Story:1 >7 DELETED
  • $ memcached -vv <3 server listening <7 new client connection <7 get app-test:Story:1 >7 END <7 set app-test:Story:2 0 >7 STORED <7 delete app-test:Story:1 >7 DELETED
  • YAGNI
  • UYRDNI
  • UYRDNI (unless you really do need it)
  • class Presentation < ActiveRecord::Base def self.get_cache(id) if data = @cache.get(id) data else data = find(id) @cache.set(id, data) data end end end
  • class Presentation < ActiveRecord::Base def self.get_cache(id) @cache.get(id) || @cache.set(id, find(id)) end end
  • Fragments Actions Sessions & Objects
  • memcache-client
  • memcache-client $ gem install memcache-client
  • topfunky memcached
  • CachedModel
  • Fragment Cache Store
  • Session Store
  • cache_fu
  • cache_fu ( acts_as_cached 2.0 )
  • Fragments Actions Sessions & Objects
  • acts_as_cached
  • config/memcached.yml defaults: ttl: 1800 namespace: railsconf sessions: false fragments: false servers: localhost:11211
  • config/memcached.yml defaults: ttl: 1800 namespace: railsconf sessions: true fragments: true servers: localhost:11211
  • config/memcached.yml production: benchmarking: false sessions: true fragments: true servers: - 192.185.254.121:11211 - 192.185.254.138:11211 - 192.185.254.160:11211
  • config/memcached.yml production: benchmarking: false sessions: true fragments: true servers: - 192.185.254.121:11211 - 192.185.254.138:11211 - 192.185.254.160:11211
  • class Presentation < ActiveRecord::Base acts_as_cached end
  • get_cache expire_cache
  • class Presentation < ActiveRecord::Base acts_as_cached after_save :expire_cache end
  • class Presentation < ActiveRecord::Base def self.get_cache(id) if data = @cache.get(id) data else data = find(id) @cache.set(id, data) data end end end
  • class Presentation < ActiveRecord::Base def self.get_cache(id) if not (data = @cache.get(id)).nil? data else data = find(id) @cache.set(id, data) data end end end
  • class Presentation < ActiveRecord::Base def self.get_cache(id) if not (data = @cache.get(id)).nil? data else data = find(id) || false @cache.set(id, data) data end end end
  • Presentation.get_cache(1337)
  • class Presentation < ActiveRecord::Base acts_as_cached :conditions => 'published = 1' end
  • class Presentation < ActiveRecord::Base acts_as_cached :finder => :find_live end
  • Topic.find :all, :conditions => [quot;created_at > ?quot;, 1.week.ago], :order => 'post_count desc', :limit => 5
  • class Topic < ActiveRecord::Base def self.weekly_popular(limit = 5) find :all, :conditions => [quot;created_at > ?quot;, 1.week.ago], :order => 'post_count desc', :limit => limit end end
  • Topic.weekly_popular
  • DB: 0.00 (0%)
  • class Topic < ActiveRecord::Base def self.cached_weekly_popular get_cache(:weekly_popular) do weekly_popular end end end
  • Topic.cached_weekly_popular
  • ruby mocha
  • bdd test spec
  • A Ruby object acting as cached - should be able to retrieve a cached version of itself - should be able to set itself to the cache - should pass its cached self into a block when supplied - should be able to expire its cache - should be able to reset its cache - should be able to tell if it is cached - should be able to set itself to the cache with an arbitrary ttl Finished in 0.028509 seconds. 28 specifications (53 requirements), 0 failures
  • context quot;Calling #cached_weekly_popularquot; do specify quot;should call #weekly_popular if not cachedquot; do Topic.expects(:fetch_cache).returns(nil) Topic.cached_weekly_popular.should.equal Topic.weekly_popular end specify quot;should return if cachedquot; do Topic.expects(:get_cache).returns(true) Topic.expects(:weekly_popular).never Topic.cached_weekly_popular end end
  • Topic.cached(:weekly_popular)
  • def self.cache_key_with_date(id) date = Date.today.to_s.tr(' ', '_') cache_key_without_date(id) + ':' + date end class << self alias_method_chain :cache_key, :date end
  • class Topic < ActiveRecord::Base def self.date_for_key Date.today.to_s.tr(' ', '_') end def self.cached_weekly_popular key = 'weekly_popular' + date_for_key get_cache(key) { weekly_popular } end end
  • Topic.find(1, 2, 3)
  • Topic.get_cache(1, 2, 3)
  • user_ids = @topic.posts.map(&:user_id).uniq @users = User.get_cache(user_ids)
  • class ApplicationController before_filter :local_cache_for_request end
  • # pulls from memcache @user = User.get_cache(1) # pulls from local cache @user = User.get_cache(1)
  • class ApplicationController before_filter :set_cache_override def set_cache_override returning true do ActsAsCached.skip_cache_gets = !!params[:skip_cache] end end end
  • www.mysite.com/home?skip_cache=1
  • reset_cache
  • @topic.set_cache
  • class Presentation < ActiveRecord::Base acts_as_cached after_save :reset_cache end
  • class Presentation < ActiveRecord::Base acts_as_cached :version => 1 end
  • monit
  • libketama
  • 1 600 200 400
  • 1 600 cache_get :railsconf 200 400
  • 1 :railsconf == 100 600 200 400
  • 1 :railsconf == 200 600 200 400
  • 1 :railsconf == 200 600 200
  • 1 700 :railsconf == 200 600 200 500 300 400
  • l33t h4x0rs • Geoffrey Grosenbach • Rob Sanheim • Ryan King • Lourens Naudé • Michael Moen • Corey Donohoe • PJ Hyett • Eric Hodel
  • {} ( thanks. any questions? )
  • http://flickr.com/photos/seibuone/144588686/ http://flickr.com/photos/j00zt1n/255430115/ http://flickr.com/photos/jameswong/145397570/ http://flickr.com/photos/xalpha/58368229/ http://flickr.com/photos/63503896@N00/35723413/ http://flickr.com/photos/mrcrash/145451993/ thanks http://flickr.com/photos/psybernoid/398301743/ http://flickr.com/photos/45royale/422227291/ flickr http://flickr.com/photos/andrson/420810541/ http://flickr.com/photos/joshuaweiland/370931770/ http://flickr.com/photos/zesmerelda/27258314/ http://flickr.com/photos/slice/390271923/ http://flickr.com/photos/cocoen/411960476/ http://flickr.com/photos/pinguino/198885132/ http://flickr.com/photos/davidfmiller/468476118/ http://laughingsquid.com - Scott Beale http://flickr.com/photos/bail56/313536999/ http://flickr.com/photos/65995199@N00/272672183/