Invalidating a cached event handler; externalizing the cache?

25 views
Skip to first unread message

Brian G

unread,
Apr 2, 2014, 5:29:23 PM4/2/14
to model...@googlegroups.com

I've just turned on eventhandler caching and I'm curious if there is an API to programmatically invalidate an entry?  My handler looks like:

<event-handler name="slug" cache="true" cacheTimeout="300" cacheKeyValues="id">

I'd like to be able to kick out /index.cfm/event/slug/id/12345 whenever slug 12345 is updated.  Possible?  I do see that the SimpleTimedCache.cfc has a purge() method that takes a key but it feels brittle to access it directly and compose the cache key.

Secondarily, I'm thinking about externalizing this cache to use redis or memcached so it can survive between model-glue restarts.  Looks like I just need the same interface and then override it in my modelglue.xml with something like:

<bean id="modelGlue.cacheAdapter" class="my.memcached.CacheAdapter">
    <constructor-arg name="sweepInterval"><value>10</value></constructor-arg>
</bean>

Key to my use case is being able to bust the cache when the underlying data changes.  It's infrequent, but needs to update quickly when it does so general timed expiration is not the best fit for this scenario.




Brian



Dan Wilson

unread,
Apr 2, 2014, 9:16:46 PM4/2/14
to model...@googlegroups.com
If you want to expire an element from the cache, I believe you are going to have to pass in the key for that element. Else, how would it know to do this?

The SimpleTimedCache.cfc in the MG distribution is really meant to be ultra simple and provide a working reference implementation so you can plug in your own cache elements.

However, one would beg the question, if you are wanting to cache content, wouldn't you be better off handling this with Varnish or Apache Traffic server? They'll scale way better than a CF based cache for sure.


DW

Wednesday, April 02, 2014 5:29 PM
--
--
Model-Glue Sites:
Home Page: http://www.model-glue.com
Documentation: http://docs.model-glue.com
Bug Tracker: http://bugs.model-glue.com
Blog: http://www.model-glue.com/blog
 
You received this message because you are subscribed to the Google
Groups "model-glue" group.
To post to this group, send email to model...@googlegroups.com
To unsubscribe from this group, send email to
model-glue+...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/model-glue?hl=en
---
You received this message because you are subscribed to the Google Groups "model-glue" group.
To unsubscribe from this group and stop receiving emails from it, send an email to model-glue+...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Brian G

unread,
Apr 7, 2014, 8:57:41 PM4/7/14
to model...@googlegroups.com

Fair enough.  How do I get a reference from MG to the SimpleTimedCache so I can test purging?  I understand it's designed to be simple but it might suit my purposes for now.


Brian

Dan Wilson

unread,
Apr 7, 2014, 8:58:44 PM4/7/14
to model...@googlegroups.com
How did you create the SimpleTimedCache? Through ColdSpring?

If so, it would be available in the beans scope (in controllers) and wherever you inject it via ColdSpring into your model.

DW

Monday, April 07, 2014 8:57 PM

Fair enough.  How do I get a reference from MG to the SimpleTimedCache so I can test purging?  I understand it's designed to be simple but it might suit my purposes for now.


Brian


On Wednesday, April 2, 2014 6:16:46 PM UTC-7, Dan Wilson - sipa...@gmail.com wrote:

Brian G

unread,
Apr 9, 2014, 11:38:44 PM4/9/14
to model...@googlegroups.com
No, I just added the following to my eventhandlers.xml file:

<event-handler name="foo" cache="true" cacheTimeout="300" cacheKeyValues="slug">

Dan Wilson

unread,
Apr 10, 2014, 11:01:23 AM4/10/14
to model...@googlegroups.com
OK. so if you aren't overriding the configuration in the base (internal) ModelGlue ColdSpring.xml, this is the one that is used:

<bean id="modelGlue.cacheAdapter" class="ModelGlue.gesture.externaladapters.contentcaching.SimpleTimedCache">

    <constructor-arg name="sweepInterval"><value>10</value></constructor-arg>
</bean>



So just use beans.modelGlue.cacheAdapter in your controllers, or inject it into your model as you please.


DW

Wednesday, April 09, 2014 11:38 PM
Monday, April 07, 2014 8:58 PM
Wednesday, April 02, 2014 9:16 PM
If you want to expire an element from the cache, I believe you are going to have to pass in the key for that element. Else, how would it know to do this?

The SimpleTimedCache.cfc in the MG distribution is really meant to be ultra simple and provide a working reference implementation so you can plug in your own cache elements.

However, one would beg the question, if you are wanting to cache content, wouldn't you be better off handling this with Varnish or Apache Traffic server? They'll scale way better than a CF based cache for sure.


DW

Wednesday, April 02, 2014 5:29 PM

I've just turned on eventhandler caching and I'm curious if there is an API to programmatically invalidate an entry?  My handler looks like:

<event-handler name="slug" cache="true" cacheTimeout="300" cacheKeyValues="id">

I'd like to be able to kick out /index.cfm/event/slug/id/12345 whenever slug 12345 is updated.  Possible?  I do see that the SimpleTimedCache.cfc has a purge() method that takes a key but it feels brittle to access it directly and compose the cache key.

Secondarily, I'm thinking about externalizing this cache to use redis or memcached so it can survive between model-glue restarts.  Looks like I just need the same interface and then override it in my modelglue.xml with something like:

<bean id="modelGlue.cacheAdapter" class="my.memcached.CacheAdapter">
    <constructor-arg name="sweepInterval"><value>10</value></constructor-arg>
</bean>

Key to my use case is being able to bust the cache when the underlying data changes.  It's infrequent, but needs to update quickly when it does so general timed expiration is not the best fit for this scenario.




Brian



Brian G

unread,
Apr 10, 2014, 5:45:44 PM4/10/14
to model...@googlegroups.com

Ah, cool - that wasn't obvious to me.  Thanks, will give it a go! 

Has anyone else implemented a more sophisticated cache, like memcached, or redis or other that uses the cache tags in eventhandlers?


Brian

Brian G

unread,
May 9, 2014, 10:49:23 PM5/9/14
to model...@googlegroups.com

On Thursday, April 10, 2014 8:01:23 AM UTC-7, Dan Wilson - sipa...@gmail.com wrote:

So just use beans.modelGlue.cacheAdapter in your controllers, or inject it into your model as you please. 

Dan,

Is it possible to inject this into a parent beanfactory?  E.g., I have in my index.cfm

<cfset ModelGlue_PARENT_BEAN_FACTORY = application.cs />

I don't think there's a way for my model in application.cs to get access to modelGlue, correct?  I'm temporarily working around this by accessing application.public.getBean("modelGlue.cacheAdapter").purge() which works but I know you don't recommend accessing the framework this way.

I'm using this from an eventgateway to synchronize multiple nodes, FWIW.


Brian

Dan Wilson

unread,
May 12, 2014, 9:27:09 AM5/12/14
to model...@googlegroups.com
I'm not exactly sure how this would work. I think if you used a getter/setter Property style injection, it could would work. However, you'd need to ensure the parent factory wasn't trying to use this before the child factory created it.

The Cache Adapter built it, is using the Model Glue scope to hold on to items. Thus, if you tried to access this inside of your Parent Bean Factory before the Model Glue scope was created (which would be a reasonable thing to try to do) it would fail pretty hard. Probably by adding your item to some mystery scope which gets blown away silently.

You'd need to test this well.

DW

Friday, May 09, 2014 10:49 PM
--
--
Model-Glue Sites:
Home Page: http://www.model-glue.com
Documentation: http://docs.model-glue.com
Bug Tracker: http://bugs.model-glue.com
Blog: http://www.model-glue.com/blog
 
You received this message because you are subscribed to the Google
Groups "model-glue" group.
To post to this group, send email to model...@googlegroups.com
To unsubscribe from this group, send email to
model-glue+...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/model-glue?hl=en
---
You received this message because you are subscribed to the Google Groups "model-glue" group.
To unsubscribe from this group and stop receiving emails from it, send an email to model-glue+...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Thursday, April 10, 2014 11:01 AM
OK. so if you aren't overriding the configuration in the base (internal) ModelGlue ColdSpring.xml, this is the one that is used:

<bean id="modelGlue.cacheAdapter" class="ModelGlue.gesture.externaladapters.contentcaching.SimpleTimedCache">
    <constructor-arg name="sweepInterval"><value>10</value></constructor-arg>
</bean>



So just use beans.modelGlue.cacheAdapter in your controllers, or inject it into your model as you please.


DW

On Wednesday, April 2, 2014 6:16:46 PM UTC-7, Dan Wilson - sipa...@gmail.com wrote:

Brian G

unread,
May 15, 2014, 2:49:49 PM5/15/14
to model...@googlegroups.com

I'm accessing application._appname for now... way easier:

<cfif structKeyExists(application, "appname")>
    <cfloop array="#local.arrEvents#" index="local.evt">
        <cfset application.appname.getBean("modelGlue.cacheAdapter").purge("eventHandler.event.name.#param#") />
    </cfloop>
</cfif>

Working well AFAICT.

Thanks!
Reply all
Reply to author
Forward
0 new messages