Just to clarify, hit does nothing for TTL (since items timeout based solely on when they were added, not when they were last touched), so swap! on the hit really makes no difference here. It would, however, be required for some of the other types of cache.
Also, exactly how you use has? / hit / miss is going to depend on how you're interacting with the cache and what behavior you want. For example, at World Singles, we use TTL caches and have three operations: * evict - this uses swap! and cache/evict to remove a cache entry * fetch - this uses get to return an entry if present * store - this uses swap! and cache/miss to add/update a cache entry Since hit doesn't do anything on a TTL cache, we don't bother calling it. If we switch to other types of cache, our fetch operation would need to be updated to use cache/has?, swap! and cache/hit (as well as get), or we'd need to change our API somewhat... It's my understanding that you can use assoc / dissoc on a cache as synonyms for miss / evict (that seemed to be true with the version of core.cache that I initially used - I'm fairly confident it's still true of assoc but not so confident that dissoc still works that way... maybe Fogus can help me out there?). Sean On Mon, Oct 22, 2012 at 2:31 PM, Sean Corfield <seancorfi...@gmail.com> wrote: > On Mon, Oct 22, 2012 at 1:50 PM, Hussein B. <hubaghd...@gmail.com> wrote: >> c3 holds a map containing {:a 1} that will lives for two minutes. > > In the code I provided, c3 is an atom that holds a cache (which is the map). > >> After two minutes, requesting :a is generating false since it reached its >> TTL but it will still live in map until it is removed explicitly by invoking >> evict. > > Because the cache itself is immutable. That's why you need to store > the cache in an atom (so the atom can be updated to contain the > modified cache): > > (defn hit-or-miss > "Given an atom containing a cache, a key, and a value, update the > cache and return..." > [a k v] > (if (cache/has? @a k) > (cache/hit @a k) > (cache/miss @a k v))) > > ... (swap! c3 hit-or-miss :c 42) ... > >> On Monday, October 22, 2012 11:15:06 PM UTC+3, Sean Corfield wrote: >>> In other words you need something like this: >>> >>> (def c3 (atom (cache/ttl-cache-factory {:a 1} :ttl 20000))) >>> user=> @c3 >>> {:a 1} >>> user=> (cache/has? @c3 :a) >>> true >>> user=> (cache/has? @c3 :a) >>> false >>> user=> @c3 >>> {:a 1} >>> user=> (swap! c3 cache/evict :a) >>> {} >>> user=> @c3 >>> {} -- Sean A Corfield -- (904) 302-SEAN An Architect's View -- http://corfield.org/ World Singles, LLC. -- http://worldsingles.com/ "Perfection is the enemy of the good." -- Gustave Flaubert, French realist novelist (1821-1880) -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en