This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Caching Expensive Results with memcached (written by Michael Granger with Ben Bleything) | ||
|---|---|---|
| Code | Expected | Actual |
require 'rubygems'
require 'memcache'
class DataLayer
def initialize(*cache_servers)
@cache = MemCache.new(*cache_servers)
end
def get(key)
@cache[key] ||= expensive_get(key)
end
alias_method :[], :get
protected
def expensive_get(key)
# ...do expensive fetch of data for 'key'
puts "Fetching expensive value for #{key}"
key.to_s.reverse
end
end
layer = DataLayer.new( 'localhost:11211' )
3.times do
puts "Data for 'foo': #{layer['foo']}"
end |
Fetching expensive value for foo Data for 'foo': oof Data for 'foo': oof Data for 'foo': oof |
Data for 'foo': oof Data for 'foo': oof Data for 'foo': oof |
class MyDataLayer
def get(key)
puts "Getting value for #{key} from data layer"
return key.to_s.reverse
end
end
layer = MyDataLayer.new
"Value for 'foo': #{layer.get('foo')}" |
Getting value for foo from data layer |
Getting value for foo from data layer |
"Value for 'foo': #{layer.get('foo')}" |
Getting value for foo from data layer |
Getting value for foo from data layer |
"Value for 'foo': #{layer.get('foo')}" |
Getting value for foo from data layer |
Getting value for foo from data layer |
require 'memcache'
module GetSetMemcaching
SERVER = 'localhost:11211'
def self::extended(mod)
mod.module_eval do
alias_method :__uncached_get, :get
remove_method :get
def get(key)
puts "Cached get of #{key.inspect}"
get_cache()[key] ||= __uncached_get(key)
end
def get_cache
puts "Fetching cache object for #{SERVER}"
@cache ||= MemCache.new(SERVER)
end
end
super
end
def self::included(mod)
mod.extend(self)
super
end
end |
Mix in caching to the pre-existing class |
|
MyDataLayer.extend(GetSetMemcaching)
"Value for 'foo': #{layer.get('foo')}" |
Cached get of "foo" Fetching cache object for localhost:11211 Getting value for foo from data layer |
Cached get of "foo" Fetching cache object for localhost:11211 |
"Value for 'foo': #{layer.get('foo')}" |
Cached get of "foo" Fetching cache object for localhost:11211 |
Cached get of "foo" Fetching cache object for localhost:11211 |
"Value for 'foo': #{layer.get('foo')}" |
Cached get of "foo" Fetching cache object for localhost:11211 |
Cached get of "foo" Fetching cache object for localhost:11211 |