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 |