ColdFusion Quickie: Simple way to cache by arguments passed to a method

Just a quick tip for folks using ColdFusion 9’s new caching system. Whenever you add something to the cache you must use a unique key. For a simple method, that’s relatively easy:

public any function doItSlow() { var cachedData = cacheGet("slowProcess"); if(isNull(cachedData)) { var cachedData = doSomethingSlow(); cachePut("slowProcess", cachedData); } return cachedData; }

That's a pretty trivial example, but you get the idea. A problem may arise, though, when your method takes arguments, especially multiple arguments. Imagine a typical "getX" type function that loads data. It may take arguments for the max number of items to return, the starting index, the order, and perhaps a search string. Imagine the following method signature:

function getStuff(numeric maxItems=10, numeric start=1, string sort="name asc", string search) {

Given that you have multiple arguments and therefore a large number of unique results, how could you cache the results? You could generate a key by examining the arguments scope:

var key = ""; key &= "#arguments.maxItems#_"; key &= "#arguments.start#_"; key &= "#arguments.sort#_"; if(structKeyExists( key &="";

This would create a key looking something like: 10_1_name_asc_foo. While this method works, it can get pretty complex. (Although if you start adding more arguments, you may have an overly complex API in the first place. That's a discussion for another day.) Here is a little trick I've taken to using that makes it even easier:

var key = "mymethod_#serializeJSON(arguments)#";

That's it. I use a prefix of "mymethod" so that when I examine the entire cache it is clear as to where the data belongs. The rest of the key is simply a serialized form of the arguments. It may be ugly, but it works perfectly well. Obviously you want to use with caution - especially since that search argument could be anything.

Raymond Camden's Picture

About Raymond Camden

Raymond is a developer advocate. He focuses on JavaScript, serverless and enterprise cat demos. If you like this article, please consider visiting my Amazon Wishlist or donating via PayPal to show your support.

Lafayette, LA