This is neat. There is one more case, where the cache is kept valid because the condition that makes it invalid is known. So, for example, if I have a message list page cached, I can simply invalidate the cache for that page when I add a new message for that specific user. Depending on the use case, I might want to even immediately repopulate that cache with the new info.
This is really the ideal scenario since things are always cached and requests don't even need to hit the dynamic site, but obviously this can't always happen since sometimes you just don't know.
I know it's an oldie, but thanks for posting this; I hadn't seen it before. Ryan Tomayko writes some quality stuff; I remember around the time Git was becoming popular, I sort of didn't understand the hype right away, and Ryan posted a great explanation (http://tomayko.com/writings/the-thing-about-git) that turned a light bulb on in my head.
This article is showing it's age. How likely is it like we are going to cache the 'welcome page' for Bob or Alice in 2013? It's pretty unlikely unless there is either zero personalisation on the welcome page or there is some Javascript hacked in to personalise the page.
More interesting is caching between our front ends and the back ends. Your backends are all serving up content over http these days so caching here makes much more sense.
This is really the ideal scenario since things are always cached and requests don't even need to hit the dynamic site, but obviously this can't always happen since sometimes you just don't know.