Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Invalidate/prevent memoize with plone.memoize.ram

I've and Zope utility with a method that perform network processes. As the result of the is valid for a while, I'm using plone.memoize.ram to cache the result.

MyClass(object):

    @cache(cache_key)
    def do_auth(self, adapter, data):
        # performing expensive network process here

...and the cache function:

def cache_key(method, utility, data):
    return time() // 60 * 60))

But I want to prevent the memoization to take place when the do_auth call returns empty results (or raise network errors).

Looking at the plone.memoize code it seems I need to raise ram.DontCache() exception, but before doing this I need a way to investigate the old cached value.

How can I get the cached data from the cache storage?

like image 751
keul Avatar asked May 12 '16 09:05

keul


1 Answers

I put this together from several code I wrote... It's not tested but may help you.

You may access the cached data using the ICacheChooser utility. It's call method needs the dotted name to the function you cached, in your case itself

key = '{0}.{1}'.format(__name__, method.__name__)
cache = getUtility(ICacheChooser)(key)
storage = cache.ramcache._getStorage()._data
cached_infos = storage.get(key)

In cached_infos there should be all infos you need.

like image 112
Mathias Avatar answered Oct 12 '22 21:10

Mathias