This will not work for me. I need pro-active TTL.<div><br clear="all"><div><div>Best regards,</div><div>Max</div><br></div>
<br><br><div class="gmail_quote">On Fri, Mar 15, 2013 at 8:28 AM, Bach Le <span dir="ltr"><<a href="mailto:thebullno1@gmail.com" target="_blank">thebullno1@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

I like this approach. Thanks for sharing. For TTL per entry, you can do it lazily. Retrieve the entry and look at the TTL, if it's supposed to expire, return nothing and don't promote this entry. The generation will eventually be "garbage collected" anyway.<br>

<br>Also, instead of create and delete table, is it faster to clear the table and reuse it? Assuming that ets does some memory pooling, clearing might be more efficient than just dropping.<div><div class="h5"><br><br>On Thursday, March 14, 2013 10:50:56 PM UTC+8, Valentin Micic wrote:</div>

</div><blockquote class="gmail_quote" style="margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">Hi Max,
<br>
<br>We have implemented something similar in the past -- we called it a generational cache (hope no-one accuses me of a plagiarism, for English is but a finite language after all. And so is the problem/solution space...).
<br>
<br>The gist of it is that instead of using a single ETS table for a cache, you would use two or more "disposable" ETS tables.
<br>The generation management is implemented as a process that, upon some criteria are met, destroys the oldest table, and creates a new one in its stead.
<br>
<br>The youngest cache (the newest ETS table) is always queried first. If the value is not found, the older tables are queried and if entry with a corresponding key is found -- it is moved to the youngest cache.
<br>If none of the ETS tables in a cache set contains the key, then the key is loaded from some external source and inserted into the youngest (the newest ETS table) cache.
<br>
<br>This method worked quite well for us in the past, and we've implemented a several variants of it, e.g. time based, size based, and combination of the two.
<br>Bear in mind that when you drop a very large ETS table (and I mean very large, as in Gigabytes of memory), it may take some time to release the allocated memory, but that may be a problem for another day.
<br>
<br>The downside, this does not really correspond to your requirement to keep a TTL per single cache entry.
<br>The upside, it is much faster and cheaper than traversing a single cache periodically. Also, it end up keeping only entries that are most frequently used.
<br>
<br>Hope this helps.
<br>
<br>Kind reagards
<br>
<br>V/
<br>
<br>
<br>On 14 Mar 2013, at 4:15 PM, Max Bourinov wrote:
<br>
<br>> Hi Erlangers,
<br>> 
<br>> How would you implement TTL with callback for ETS based cache?
<br>> 
<br>> I want when TTL expires callback is triggered and cached value goes to DB.
<br>> 
<br>> For key I use 32 byte long binary(), value is not bigger than 8 KB. 
<br>> 
<br>> Any suggestions?
<br>> 
<br>> p.s. elang:send_after/3 is a most brutal approach, but how would it be when cache is under load?
<br>> 
<br>> Best regards,
<br>> Max
<br>> 
<br>> ______________________________<u></u>_________________
<br>> erlang-questions mailing list
<br></div></div>> <a>erlang-q...@erlang.org</a>
<br>> <a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/<u></u>listinfo/erlang-questions</a>
<br>
<br>______________________________<u></u>_________________
<br>erlang-questions mailing list
<br><a>erlang-q...@erlang.org</a>
<br><a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/<u></u>listinfo/erlang-questions</a>
<br></blockquote><br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div>