Cache Block is a plugin for Movable Type that can dramatically speed up publishing by caching blocks of built template code. Cache Block is very flexible, enabling you to cache an entire page, a small template snippet, a template module, a sidebar widget, and entire sidebar, etc. Each block can be set to expire after a certain duration -- some blocks you may want to cache for 5 minutes, others for hours, or even days. When used wisely, the result is significantly faster publishing times and faster comment-posting.
Cache Block on ReadWriteWeb
ReadWriteWeb is a very popular technology blog with many entries and comments. And with over 130 front page Diggs and counting, ReadWriteWeb gets a lot of traffic. With the goal of speeding up publishing and comment posting, I recently implemented Cache Block on ReadWriteWeb. Combined with other optimizations, Cache Block helped to significantly improve publishing speed and now comments post much faster. This is one example of Cache Block being used on a live, busy site.
How It Works
For each page that is published by Movable Type, a large number of template tags are evaluated by the system, which often requires many database lookups. The Cache Block plugin strives to reduce those database lookups by caching groups of template code that has already been evaluated. For example, suppose you decided to cache your entire sidebar. The first time MT publishes that sidebar, it will do many database lookups to generate lists of recent entries, comments, lists of archives and tags, etc. After that, the Cache Block plugin will take all of that sidebar HTML and save it in the cache. The next time MT needs to publish your sidebar, it will find it in the cache, so it will skip the evaluation and related database lookups for the entire sidebar, and simply fetch the pre-built sidebar from the cache. This can speed up the process a lot. Imagine if you are trying to publish a 1000 page site, and each of those pages includes the sidebar!
Behind the scenes, Cache Block checks to see if memcached is available and enabled. If it is, CacheBlock will stores blocks using memcached, which is very fast. BUT, you don't need to have memcached! If memcached is not available, Cache Block will simply store the block in the database. As such, it will still require a database lookup to retrieve it from the cache, but you can save dozens or even hundreds of database lookups by caching significant segments of built template code, by replacing them with a single lookup to the cache. Even without memcached, Cache Block can dramatically speed up publishing.
Cache Block has just one template tag:
- <MTCacheBlock> - This container tag should be wrapped around the block that you want to cache. Everything between the opening <:MTCacheBlock> and the closing </MTCacheBlock> will be saved as a single block in the cache. There are several arguments for this tag:
- key - (Required) The key argument represents the cache key, a unique identifier for the cache block. Each block should have unique key. Note that keys are not namespaced on a per-blog basis -- meaning that a key of "foo" used in one blog will overwrite a key of "foo" on another blog.
- expiry - (Required) The number of minutes that the block will be stored in the cache. Longer expiry times will result in more speed improvements, but the ideal expiry depends greatly on the content being cached and the volume of activity of your site.
- refresh - (Optional) This argument is designed for temporary use only. Adding refresh=1 will force an update of the cache. In other words, with this argument, blocks will never be fetched from the cache. This argument is useful when you are making design changes to your templates, and you want to refresh the cache block so that you can view your changes on your site. After your template editing is complete, remember to remove the refresh=1 from all MTCacheBlock tags, so you can once again reap the benefits of the cache.
Cache Block Expiry
For Cache Block stored in the database, blocks are expired by a scheduled task that is set to run once per minute, at most. To ensure timely expiry of cache blocks, I strongly recommend that you set up a cron job to run the /tools/run-periodic-tasks script on a regular frequency that is consistent with your caching strategy. Click here for more information about scheduled tasks and setting up a cron job.
Cache Block Pro
Cache Block Pro includes the same powerful caching features, and adds powerful administration tools to facilitate further optimization and management of your Cache Blocks. Features include:
- Flush Entire Cache - This useful function provides a quick way to flush your entire cache. Normally, you wouldn't want to do this, but during a redesign of your site, this one can come in handy.
- Cache Blocks Widget - When you are editing a template, this widget will appear on the right side of the page, listing the Cache Blocks used by the template. When possible, listed blocks will have a "flush" link next to them so you can flush a single block easily. You can also click on the linked names of the blocks to view the contents of the Cache Block.
- View All Cache Blocks - Use this feature to view a list of all Cache Blocks on the system, including the expiry date of each. Note that this feature is not currently available if you are using memcached.
- Edit Cache Block - Manually edit the contents of specific Cache Blocks and change the expiry dates as desired.
- View Rendered Block - From the Edit Cache Block screen, you can view the rendered HTML of the block. Instead of view the built HTML source, this will display thye block as it would be shown in the browser (in most cases, without applying your external styles)
Note: The Pro features described above require MT4.01 or higher.
- Upload the contents of the 'plugins' folder to the 'plugins' directory of your MT installation (usually /cgi-bin/mt/plugins/)
- Start using the >MTCacheBlock> tag in your templates, as described above.
Get Cache Block Pro
Get Cache Block
Cache Block is free for personal or evaluation use.
Downloads: <$MTAjaxRatingVoteCount id="1" type="cacheblockdownloads"$>
As always, comments, questions, and suggestions are welcome.