Slideshare.net (beta)

 
Post to TwitterPost to Twitter
Post: 
Myspace Hi5 Friendster Xanga LiveJournal Facebook Blogger Tagged Typepad Freewebs BlackPlanet gigya icons

All comments

Add a comment on Slide 1

If you have a SlideShare account, login to comment; else you can comment as a guest


Showing 1-50 of 8 (more)

Kickin' Ass with Cache-Fu (without notes)

From err, 2 years ago

My memcached talk at RailsConf 2007 (without notes). See the blog more

6180 views  |  2 comments  |  7 favorites  |  199 downloads
 

Categories

Add Category
 
 

Tags

memcached ruby rails err railsconf railsconf2007 portland memcache deployment rubyonrails

more

 
 

Groups / Events

 
Embed
options

More Info

CC Attribution License
This slideshow is Public
Total Views: 6180
on Slideshare: 6180
from embeds: 0

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/