Many people will say their web site is not cacheable and can't be accelerated since the content is all dynamic.  I say chances are the site is deterministic and not dynamic, if the site is deterministic it is easily able to be accelerated.  Let's take a look at a site that everybody is familiar with DevCentral - would you call this site dynamic or deterministic?  If you said deterministic you would be correct.  The content changes and is displayed in a way that can easily be determined such as the presence of a cookie to indicate the user is a returning visitor and is already logged in or the posting of a new question in one of the forums.   When user actions or the presence of certain parameters in the request determines how an application should behave that application is deterministic.

Even if the application is truly dynamic there are certainly portions of the site that are static such as the style sheets, JavaScript, and images.  These files typically don't change on a regular basis so extending how long these items are cached by a browser can significantly improve the page load time.  The issue with setting long cache lifetimes is you run the risk of serving stale data, if the content is modified the browser will not be notified and will continue to load the content from the local cache.  For this reason many web sites set cache lifetimes for less than 24 hours.  There are technologies available that give you the best of both worlds - the ability to cache static content on the browser for months yet still ensure that if the content changes the browser will request the new updated version.  F5 Networks calls this Intelligent Browser Referencing and can be seen in action in the screen shot below:

 F5Objects

The links for the static content such as the CSS and JS files are appended with a hash and the expiration for the content is set on the browser for 180 days.  When the content is changed the hash that is computed will be different, the item will not match to previously cached content and the browser will issue a GET request for this new content.

Even yet another way that dynamic data can be cached is by using technologies such as Edge Side Includes (ESI).  ESI can break a site into fragments so the static sections that are the same for all users can be cached, while the dynamic portions are generated individually.  At it's simplest a page can be divided into two fragments; one for the header and one for the main body. A fragment for the header may not be considered cacheable as this is dynamically generated by the application with user configurable options and customizations such as the users name or unread messages while a fragment for the body is the same for each and every user and can easily be cached.  Browser's are not able to render and assemble ESI fragments as a result the use of ESI requires the use of a product such as WebAccelerator which is able to assemble the fragments into HTML that a browser can render.