Slideshow transcript
Slide 1: CHRIS WANSTRATH ERR FREE [ http://errfree.com ]
Slide 12: 50,000,000 pages no downtime
Slide 13: memcached.
Slide 14: Memcaching Rails CHRIS WANSTRATH ERR FREE [ http://errfree.com ]
Slide 15: Memcaching Rails CHRIS WANSTRATH ERR FREE [ http://errfree.com ]
Slide 16: chris wanstrath railsconf 2007 kickin’ ass with cache-fu
Slide 17: {}
Slide 18: class Memcache < Hash undef :each, :keys end
Slide 19: class Memcache < DRbHash undef :each, :keys end
Slide 20: $ 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
Slide 21: $ 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
Slide 25: YAGNI
Slide 26: UYRDNI
Slide 27: UYRDNI (unless you really do need it)
Slide 29: 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
Slide 30: class Presentation < ActiveRecord::Base def self.get_cache(id) @cache.get(id) || @cache.set(id, find(id)) end end
Slide 31: Fragments Actions Sessions & Objects
Slide 32: memcache-client
Slide 33: memcache-client $ gem install memcache-client
Slide 34: topfunky memcached
Slide 35: CachedModel
Slide 36: Fragment Cache Store
Slide 37: Session Store
Slide 41: cache_fu
Slide 42: cache_fu ( acts_as_cached 2.0 )
Slide 43: Fragments Actions Sessions & Objects
Slide 44: acts_as_cached
Slide 45: config/memcached.yml defaults: ttl: 1800 namespace: railsconf sessions: false fragments: false servers: localhost:11211
Slide 46: config/memcached.yml defaults: ttl: 1800 namespace: railsconf sessions: true fragments: true servers: localhost:11211
Slide 47: 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
Slide 48: 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
Slide 49: class Presentation < ActiveRecord::Base acts_as_cached end
Slide 50: get_cache expire_cache
Slide 51: class Presentation < ActiveRecord::Base acts_as_cached after_save :expire_cache end
Slide 52: 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
Slide 53: 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
Slide 54: 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
Slide 55: Presentation.get_cache(1337)
Slide 58: class Presentation < ActiveRecord::Base acts_as_cached :conditions => 'published = 1' end
Slide 59: class Presentation < ActiveRecord::Base acts_as_cached :finder => :find_live end
Slide 60: Topic.find :all, :conditions => [\"created_at > ?\", 1.week.ago], :order => 'post_count desc', :limit => 5
Slide 62: class Topic < ActiveRecord::Base def self.weekly_popular(limit = 5) find :all, :conditions => [\"created_at > ?\", 1.week.ago], :order => 'post_count desc', :limit => limit end end
Slide 63: Topic.weekly_popular
Slide 64: DB: 0.00 (0%)
Slide 65: class Topic < ActiveRecord::Base def self.cached_weekly_popular get_cache(:weekly_popular) do weekly_popular end end end
Slide 66: Topic.cached_weekly_popular
Slide 68: ruby mocha
Slide 69: bdd test spec
Slide 70: 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
Slide 71: context \"Calling #cached_weekly_popular\" do specify \"should call #weekly_popular if not cached\" do Topic.expects(:fetch_cache).returns(nil) Topic.cached_weekly_popular.should.equal Topic.weekly_popular end specify \"should return if cached\" do Topic.expects(:get_cache).returns(true) Topic.expects(:weekly_popular).never Topic.cached_weekly_popular end end
Slide 72: Topic.cached(:weekly_popular)
Slide 74: 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
Slide 75: 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
Slide 78: Topic.find(1, 2, 3)
Slide 79: Topic.get_cache(1, 2, 3)
Slide 80: user_ids = @topic.posts.map(&:user_id).uniq @users = User.get_cache(user_ids)
Slide 81: class ApplicationController before_filter :local_cache_for_request end
Slide 82: # pulls from memcache @user = User.get_cache(1) # pulls from local cache @user = User.get_cache(1)
Slide 83: class ApplicationController before_filter :set_cache_override def set_cache_override returning true do ActsAsCached.skip_cache_gets = !!params[:skip_cache] end end end
Slide 84: www.mysite.com/home?skip_cache=1
Slide 88: reset_cache
Slide 89: @topic.set_cache
Slide 90: class Presentation < ActiveRecord::Base acts_as_cached after_save :reset_cache end
Slide 92: class Presentation < ActiveRecord::Base acts_as_cached :version => 1 end
Slide 94: monit
Slide 95: libketama
Slide 96: 1 600 200 400
Slide 97: 1 600 cache_get :railsconf 200 400
Slide 98: 1 :railsconf == 100 600 200 400
Slide 99: 1 :railsconf == 200 600 200 400
Slide 100: 1 :railsconf == 200 600 200
Slide 101: 1 700 :railsconf == 200 600 200 500 300 400
Slide 102: l33t h4x0rs • Geoffrey Grosenbach • Rob Sanheim • Ryan King • Lourens Naudé • Michael Moen • Corey Donohoe • PJ Hyett • Eric Hodel
Slide 103: {} ( thanks. any questions? )
Slide 104: 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/




Add a comment on Slide 1
If you have a SlideShare account, login to comment; else you can comment as a guest- Favorites & Groups
Showing 1-50 of 8 (more)