Introduction to new caching engines
ColdFusion already has support for caching using ehcache. There are many caching engines available in the market and each has its pros and cons. Depending upon your application, one caching engine might suit your application more than another. So we need to integrate more caching engines.
In the 2018 release of ColdFusion, we have added support for 3 new caching engines
- JCS (Java caching system)
- Redis
- Memcached
Java Caching System (JCS)
Pros
- One of the fastest caching solution. It is faster than ehcache.
- Support for database backup (not related to cfquery).
- Support for regions and statistics.
Cons
- Cache replication is difficult.
- Distributed caching is not possible.
Memcached
Pros
- Distributed caching and cache replication is easier.
- Cache memory can reside on a different system.
- Memcached server is multi-threaded. As a result, it can effectively harness multiple cores.
- For simple key-value pairs, Memcached is more memory efficient than Redis.
- Memcached can easily handle websites with high traffic.
- memcached consumes fewer memory resources for metadata.
Cons
- Memcached is slower than same VM in-memory caching solutions like ehcache and JCS.
- You cannot list all keys in Memcached
- The size of a key cannot be greater than 250 bytes.
- There is no support for idle time, regions, and statistics (we have written a wrapper).
Redis (REmote DIctionary Server)
Pros
- Distributed caching and cache replication is easier
- Cache memory can reside on different systems.
- Cache persistence is possible.
- Supports many datatypes – Strings, Hashes, Lists, Sets, etc.
Cons
- Slower than same VM in-memory caching solutions like ehcache, JCS.
- Redis is single threaded. As a result, Redis can’t effectively harness multiple cores.
- There is no support for idle time, regions, and statistics (we have written a wrapper).
Server-side caching engine
Let’s try running this simple caching code, cacheEngines. It inserts an element into the cache, retrieves it, and prints the current caching engine being used.
Cachegetengineproperties is a newly added function which will return the caching engine currently being used by the page. Running this code will print ehcache.
Now let’s go to CF admin and switch the caching engine.
Click on JCS and submit and rerun the downloaded code snippet. It will print JCS this time. So this is how simple it is to switch caching engine at the server level.
Server level caching settings
You can specify server level cache settings for each caching engine from admin in caching page or directly change at lib/rediscache.properties, lib/memcachedcache.properties, lib/cache.ccf, and lib/ehcache.xml.
- Max idle is the default value for max idle time for any element in cache in seconds.
- Max life is the default value for the max life span of any element in cache in seconds
- Max elements is the default value for max number of elements which can be stored in the cache
If eternal is true, elements will not expire ever.
Application level caching engines
Users can specify different cache engine at application level in application.cfc. We have introduced a new property this.cache.engine which can accept one of the four values – ehcache, jcs, redis, memcached. Here you can specify the name of the caching engine which needs to be used for the given application.
We can run the same code present inside some application. It will print the name of the caching engine which you would have specified in application.cfc. So, you can have multiple applications, each using different caching engine which itself would be different from the default caching engine specified at the server level. If no caching engine is provided at application.cfc level, it will pick the default server cache engine.
Application level caching settings
In application.cfc file, you can specify the settings for the caching engine specific to this application. Either you can specify the path of property file that will contain key-value pairs of these settings or you can directly specify them in the form of a struct
You can have two applications, both using Memcached, one with timeToLive value as 60 seconds and another with the value 120 seconds.
Configuring Memcached
While ehcache and JCS come bundled with ColdFusion, Memcached and Redis need to be installed separately. Once you install Memcached, integrating it with ColdFusion is pretty simple. A new section has been added to the caching page – Memcached cache settings. Here you can specify the IP address and port of the Memcached server you have just installed.
Replication
Multiple ColdFusion nodes can point to same Memcached server.
Distributed caching
If you want distributed caching, you can install multiple Memcached servers and then add comma separated IP addresses of Memcached servers in this section. So if one of the Memcached server goes down, others will take the load and keep on serving.
Configuring Redis
Similar to Memcached, Redis also needs to be installed separately. Once you install it, you need to add the server details in the caching page.
Replication
Multiple ColdFusion nodes can point to same Redis server.
Distributed caching
If you want distributed caching, enable Redis in cluster mode. Once you do that, you need to enable the ‘is cluster’ check-box.
Comparison of engines
To folks reading this post, it seems worth noting that the new Distributed Caching options in CF2018 (Redis and memcached) are in fact offered only in the Enterprise (and trial and developer) edition only, and NOT in Standard.
Can someone from Adobe confirm? I’m pretty sure I did, when I was helping someone whose site was running CF2018 Standard. While it DID offer the new JCS option (in the CF Admin caching page), it did NOT offer the UI elements for Redis or memcached.
If this is so, then it seems this page (and others) ought to indicate that for readers. From what I’ve seen, there’s a mishmash of indications across various docs (perhaps reflecting a time when edition differences were not known or were not yet stated publicly). Now several months later, they ought to be updated.
First, the buying guide PDF (alone, currently) DOES indicate currently that “Distributed cache” is Enterprise-only, showing a “New” indication under only the CF2018 Enterprise column and NOT the CF2018 Standard column.
But then the CF features page for Standard DOES list distributed caching, as if it IS a feature of that edition (of course, so does the Enterprise version of that page, as it should).
And this blog post is not the only page that make no mention of edition differences regarding caching. First, the doc page point to in the comments above currently does not, nor does this page also called “buying guide” (despite the name, it’s NOT just an HTML version of the PDF listed above).
Finally, again in making any such changes, it would be important to clarify that (as I understand it) the JCS feature IS in Standard (while new, it’s not technically “distributed”).
As always, hope that helps.
James,
We already have, https://helpx.adobe.com/in/coldfusion/developing-applications/changes-in-coldfusion/caching-enhancements.html.
However, I’ll update this page with some new info from the blog.
You must be logged in to post a comment.