Practical ASP.NET

Two Reasons You're Not Using the Cache and How To Deal With Them

Peter stumps for the Cache, despite developers' worries over stale or lost data.

Developers worry that when they use the Cache, they'll be working with stale data -- or may lose their data altogether. And to that, I say: Stop worrying. Be happy. Use the Cache.

In an earlier column ("Faster Applications with Caching") I enthused over the wonderfulness of using the Cache. Having been so positive, it's only fair to point out that there are two problems with using the Cache: stale data and lost data.

How Stale Is Your Data?
Developers point out that the data held in the Cache is disconnected from the data in the database and, as a result, is out of date ("stale") as soon as someone makes a change to the database. This is less of a problem then you might think.

For instance, most companies have an enormous amount of data that's non-volatile: It just doesn't change all that often. The obvious example is the list of countries that appears in the drop-down lists on Web pages all over the world. But if you're concerned that a new country may have been added to this list during the day, you can have the items in the Cache dumped every night at midnight. Assuming you're using the code in my previous article, the next time somebody needs that list they'll get the freshest version.

A lot of data is "semi-volatile": It does change, but not very often. Your company may offer a list of services that does change -- but how often? Even if you add a new service, do you need to access it in your Web interface on the same day? If you've arranged for your Cache items to be dumped at midnight, then your application will have the new data tomorrow. This solution also works for data that's updated during batch processes that run at night.

If you do need to have your data refreshed right away, the page or form that updates the list of services can remove the list of services from the Cache after changing it either directly or by calling a Web Service (a simple service that's passed the name of the Cache item to be removed would support all of these requests). If your database engine is SQL Server 2005 or later, you can even automate this process.

Finally, even if your data is volatile, ask yourself, "Is the only application driving the volatility this Web application?" If so, you can write your application to update the data in the Cache rather than the data at the database. Now you're saving time on both your reads and writes.

Losing Data
At this point, it often occurs to people that the Cache is just holding things in memory where things do, occasionally, get lost. In fact, when you start to run out of memory, you're guaranteed that items in the Cache will get lost.

However, there is a solution: the Cache callback. When you insert an item into the Cache, you can specify a method to be called when the Cache discards the item. In the callback method you just need to update the database with the data being discarded. The net result: Periodically, your Cache will be cleared out, your database will be updated with the latest version of the data and (the next time someone needs the data) it'll be retrieved and put back in the Cache.

Updating data in the Cache won't work with a Web farm because each server in the farm will have their own copy of the items in the Cache. However, in that case you can fall back on an earlier solution: When an item changes, remove the item from the Cache on each server in the farm.

At this point, I often hear one last objection: If my Web server crashes, I'll lose all the data in the Cache. I don't have a solution for that problem...but if your Web server is liable to crash, then you have problems that even I can't solve.

About the Author

Peter Vogel is a system architect and principal in PH&V Information Services. PH&V provides full-stack consulting from UX design through object modeling to database design. Peter tweets about his VSM columns with the hashtag #vogelarticles. His blog posts on user experience design can be found at http://blog.learningtree.com/tag/ui/.

comments powered by Disqus
Upcoming Events

.NET Insight

Sign up for our newsletter.

I agree to this site's Privacy Policy.