kickin' ass with cache-fu (without notes)

Post on 19-Jan-2015

9.541 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

CHRIS WANSTRATHERR FREE

[ http://errfree.com ]

50,000,000 pages

no downtime

memcached.

Memcaching Rails

CHRIS WANSTRATHERR FREE[ http://errfree.com ]

Memcaching Rails

CHRIS WANSTRATHERR FREE[ http://errfree.com ]

kickin’ asswith cache-fu

chris wanstrathrailsconf 2007

{}

class Memcache < Hash undef :each, :keysend

class Memcache < DRbHash undef :each, :keysend

$ 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

FragmentsActions

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 )

FragmentsActions

Sessions&

Objects

acts_as_cached

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

config/memcached.yml

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 => ["created_at > ?", 1.week.ago], :order => 'post_count desc', :limit => 5

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

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 "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 endend

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_requestend

# 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

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

200

400

600

1

200

400

600 cache_get :railsconf

1

200

400

600

:railsconf == 100

1

200

400

600

:railsconf == 200

1

200600

:railsconf == 200

1

200

400

600

:railsconf == 200

500 300

700

l33t h4x0rs

• Rob Sanheim• Lourens Naudé• Corey Donohoe• Eric Hodel

• Geoffrey Grosenbach• Ryan King• Michael Moen• PJ Hyett

{} ( 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/http://flickr.com/photos/psybernoid/398301743/http://flickr.com/photos/45royale/422227291/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 Bealehttp://flickr.com/photos/bail56/313536999/http://flickr.com/photos/65995199@N00/272672183/

thanksflickr

top related