Erector Cache¶ ↑
Widget caching for Erector.
Note: This only works at the widget level as this is essentially a fragment caching utility, and will not work for widgets rendered directly from a controller. (widget vs render_widget)
Installation¶ ↑
sudo gem install erector_cache
Checkout redis github.com/antirez/redis and install
MAKE SURE REDIS SERVER IS RUNNING
First, connect to the Redis database. This would most likely go into an environment.rb.
Lawnchair.connectdb
This will connect to a default database on localhost, if you want to connect to a particular database you can do:
Lawnchair.connectdb(Redis.new(:database => 11, :host => "127.0.0.1", :port => 6379))
Usage¶ ↑
-
cache_for - Use this to tell the widget how long it should be cached for. Defaults to 1 hour
-
cache_with - These are the widget parameters you want to use to build the cache key
-
expire! - Expire the instances of a widget matching the given parameters
class Bluth < Erector::Widget cache_with :name, :mistake cache_for 3.seasons def content div "My name is #{@name} and #{@mistake.to_param}" end end class Mistake < ORM::Base attr_reader :updated_at def initialize(size) @size = size || :huge @updated_at = Time.now end def size @size end def to_param "I_just_made_a_#{size}_mistake" end end
cache_with¶ ↑
In the simple case the cache key will be built off of the value of the parameter eg.
widget Bluth, :name => "George Michael", :mistake => "consubrinaphilia"
This will yield a cache key of “Lawnchair:Bluth:name:GeorgeMichael:mistake:consubrinaphilia”
You can also pass whole objects into the widget and build the cache based on this. It will default to using the to_param of the object as the key component value.
@mistake = Mistake.create(:huge) widget Bluth, :name => "Gob", :mistake => @mistake
This will yield a cache key of “Lawnchair:Bluth:name:Gob:mistake:I_just_made_a_huge_mistake”
This is essentially the same as doing this, which opens up more complex possibilities for generating cache keys
class Bluth < Erector::Widget cache_with :name, :mistake => lambda {|mistake| mistake.to_param } end @mistake = Mistake.create(:huge) widget Bluth, :name => "Gob", :mistake => @mistake
Using this, we could set the cache to auto expire every time the associated object is updated.
class Bluth < Erector::Widget cache_with :name, :mistake => lambda {|mistake| mistake.updated_at } end
Expiration¶ ↑
Widget expiration is possible by calling the widget class’s expire! method and passing in as much information about the keys to expire as you want.
Assume the following have occurred:
widget Bluth, :name => "Tobias", :mistake => "I_just_blue_myself" widget Bluth, :name => "Tobias", :mistake => "analyst_and_therapist" widget Bluth, :name => "Buster", :mistake => "swimming_with_seal"
You can expire all Bluth widgets regardless of what the values of the params passed into them with:
Bluth.expire!
You can expire only the Bluth widget with :mistake => “I_just_blue_myself” by using:
Bluth.expire!(:mistake => "I_just_blue_myself")
You can expire all widgets with :name => “Tobias” with:
Bluth.expire!(:name => "Tobias")
Likewise, calling the following will expire only the one cached version of the widget that exists, leaving the other instance in the cache:
Bluth.expire!(:name => "Tobias", :mistake => "I_just_blue_myself")
Any cache key component that is not passed into the expire! method will result in a wildcard match on that component, allowing you to be as specific as you wish.
Note: Lawnchair will automatically condense spaces, so don’t feel constrained to using underscores or dashes in keys.
....:~~~~~~~~~~~~~:~~::::::,..
......,~===~=====~~~~~::::::::::::::,..... ..
....,~+++=++++++==~~~~:::::::::::::::,... ..
..~I?+?????+?+++===~~~~::::::::::::::~:,... .
.=I7?I?????+?+++===~~~~~:::::::::::::~~:.... ..
.....~$$77II7III?+?++++===~~~~::::::::::::::~~=:......
....:ZZ$$7IIIIII???++++++==~~~:::::::::~~~:~~~==,.....
....7OZZ$77I777I????+++++==~~::::::::::~~::~~~===, ..
...?OOOZ$$$7777II?????+++===~~:::::::::::::~~~~==~....
..,7OOO$$$$$7777II??+++==~~~~~::::::::::::~::::~~=,...
. ?OOOOZZ$$$77777I??++=++=~~~~:::::::::::::::~~===:...
..I8OOO$Z$ZZ77777I???+=+==~~::::::::::,:::::~=+++++...
,78OOO$ZZZ$$7777II7ZOOOOZ$7?+~~::::,,,::~~~?I7ZOOZ?..... ..
,7O8OO$$ZZZ$77$77ZOO8OOZ$II?+++=::,,,:::~===~+++I$Z:.... ..
:7O88O8Z$$$$$$$OOZ???+III777$?+=~~::::::~:=I7+=::~+:~~, ..
,7OOO8OOZ77$I$OZIII~~~~=+???++I7I=:~=~=+I$=~I~=~:~+...=,:,
..IOOO8OOZ777IZZ+=I++++?+=??I7II7$Z$??I$$$+?+=::~~=:.. ,=?:
..?O88O88OZ$$$$7$Z+?+?77ZOO7III$7$ZI=:::Z7+78ZO8$I~=~++,~=..
..+O88O8OOZ$777=$7=??$ODN$8?+$I?7787=~~:O$?ZN88$Z8?=~...+:..
,:+7ZDDD8OZZ$$7?$Z?IZOII$7?++++?77$??+~:IZ=?+~~=+II=,...+,.
.....:II++7O8DOZ$$7$7IIZ??7Z7?~~=+++=+7O7+I?=:+$~=?7I??I?+:..:+..
... .?ZOZ?++$8O$$7777??7$=???I?+===~:~77+I?==~:~=~~~~~~~~==.,:..
... ,+77?7OI78O777777II+?$=~~~~~~~:::II+$7?+~:~:~~~:,:::::~=:.....
....,+77==Z$$8O$7777IIII??I=:::::,,+?II?77I+~,,::=I7~,,.:=++:....
.....=7?=?O8$88Z$$$777II?+=+7$IIII=:+$7III77?==~~=+=+?+=~~~~:.....
.....~7++7877O8O$$$$77I?+===:~~:::~+IZ$I?+7O$+=~~?++==~::::~:....
.....,I+?==?788OZZ$$77II?+==~~~~~===+7ODD8OZ8OZZ8D7+~~++~~~=: ...
......I=+=+I7O8OOZZ$777I??+===~~====+?IOO$7$O88Z$$7+=~=+=~==:.....
,$++7ZIOD8OZ$$$7777I?++=====?I$ZZZ$Z77ZZOOZ$ZZ$I+~+++=.....
~I++?7OO$$$$$$777$77?++=?IZOZOOOOZZOOOOOOZ$ZOZ$Z$+=+~......
.,?++?IZO$$Z$$$777777I??I$ZOOOOOOOZZOZZ7II$7IZOOOZI=+~......
..,II=:?Z$$$$$$77I77I?78888888OZZZ$77$III7?+?$O8OO$++,.. .
...,,..,7$$$$$$77I7777O8O8D888OZ?II:===?=,:.?NNOZO7++,..
........?7$$$$$77II77II=+77Z8NNNNDNNN8DNDNMNO7+?7I++~. .
........?$$$$$$$7I777I?==+++?IO8OZI==,::,?$7I?==?+==:
.....?7$$$$Z$77I7$$7?=++++I??7I+===+?+=?I?===~=+=..
..?$$ZZZZ$$$77777I?+=+++II++++=====++===~~==+...
. ?$$$ZZZZ$$777777I+=+++?II?+????++?+++=~~==~...
. . ..I$$ZZOOOZZ$$777777+=+?+=+?++++==+=~~~~~~~~...
.......:$$ZZZOOOOOZZ$777$$?+=+++===~~=~~~~~~~~~~=, ..
.....,I$7$$$$$ZOOOOZ$$7$Z7I+=====~~:::~:~~~~~=~.....
. ....+77777$$$ZOO88OZZ$$Z$I?+=====~~::~~~~~=~=,.. ..
. .,, ......,I77$$7I7777$$ZO888OOZOO$I?+++==~::~~:~=~+~ . . ..
. :D88DDDZ7+:.,?7I7$$$7IIIII777$ZOOO888OOZ$II??+====+==++,.
..?8Z8O88DDDDO7I??777IIIII?77I7$$ZOOOOOOOOZ$$7I?+===+???,..
,Z8OOOOOO888888DD8DDD88DDD$?IIII7$ZOZOOOOOOOOZZZZZ$Z$I=.....
Copyright¶ ↑
Copyright © 2010 Grockit. See LICENSE for details.