Upload
err
View
9.541
Download
2
Tags:
Embed Size (px)
DESCRIPTION
My memcached talk at RailsConf 2007 (without notes). See the blog post: http://errtheblog.com/post/4872
Citation preview
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
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
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