The $dotcache
Velocity Viewtool allows temporary storage of generic object data.
Introduced in version 23.01, $dotcache
grew out of the older #dotcache
directive, and provides an easy way to store data from, e.g., a third-party system.
This viewtool is mapped in toolbox.xml file as follows:
<tool>
<key>dotcache</key>
<scope>application</scope>
<class>com.dotcms.rendering.velocity.viewtools.dotcache.DotCacheTool</class>
</tool>
Usage
Command | Result |
---|---|
$dotcache.get("foo") or $dotcache.foo or $dotcache["foo"] or $dotcache[$foo] | Four equivalent ways to retrieve the object stored with cache key foo — in the last case after the declaration of #set($foo = "foo") |
$dotcache.put("foo", "bar"[, 60]) | Stores the value bar behind the cache key foo , with an (optional) expiration of 60 seconds; if a third argument is not set, the data will be cached forever. (Strictly speaking, it's about 68 years, but who's gonna check?) |
$dotcache.putDebounce("foo", "bar"[, 60]) | Identical to .put() , but with a one-second debounce added before taking effect; this can lessen system overhead in cases where immediate reading of stored data is not necessary |
$dotcache.remove("foo") | Removes data stored in cache memory behind the cache key foo |
$dotcache.clear() | Clears all objects from the cache memory associated with this viewtool |
Purge
A complete purge of the cache used by $dotcache
— and the #dotcache
directive — can be achieved by visiting the Maintenance panel under System → Maintenance, and navigating to the Cache tab. There, use the dropdown menu to select the Block Directive cache, and then click the Flush button.
Examples
Check for Cached Data Before Operation
#set($testing = $dotcache.get("my-cache-key"))
#if(!$testing)
#set($testing = $json.fetch("https://demo.dotcms.com/api/content/render/false/query/+contentType:Activity%20+deleted:false%20+working:true/orderby/modDate%20desc/limit/4"))
## cache for 5 minutes
$dotcache.put("my-cache-key", $testing, 600)
## or cache forever by using this instead:
## $dotcache.put("my-cache-key", $testing)
#end
<ul>
#foreach($con in $testing.contentlets)
<li>$con.title</li>
#end
</ul>
Simple IP-Based Rate Limit
This works in tandem with the Request object to obtain a user's IP address, which is used as a cache key. The following code permits no more than three consecutive accesses without a 10-second gap.
#set($cacheKey = "$!{request.getRemoteAddr()}")
#set($rateCheck = $dotcache.get($cacheKey))
#if(!$rateCheck)
#set($rateCheck = 1)
#elseif($rateCheck < 3)
#set($rateCheck = $rateCheck+1)
#else
## Too many requests!
## Inexpensive code goes here
$response.sendError(429)
#stop
#end
$dotcache.put($cacheKey, $rateCheck, 10)
## Expensive code goes here
Note that this is a simple example that may not work properly in cases where $request
cannot retrieve an accurate end-user IP, such as in certain configurations behind a load balancer.