Hey Colin,

That doesn't mean guava wouldn't be a nice solution here still. Just 
.invalidateAll to purge it. Might even use softValues to let the gc decide 
to remove some entries when running low on memory. Emulating a mutable 
thing in clojure with an atom is not always better than using the mutable 
thing in the first place. ;)

But there are other issues to think about in regards to shipping Cursive 
with Guava. So if it works in plain Clojure its proably good enough.

Just my 2 cents,
/thomas



On Monday, September 1, 2014 11:21:11 AM UTC+2, Colin Fleming wrote:
>
> Hi Thomas,
>
> Normally I'd agree with you, but in my case it actually works quite well 
> since I don't need to expire or worry about sizing. This is for caching 
> objects on IntelliJ parse tree elements, and the element with its cached 
> values is thrown away every time the document is parsed, so these are 
> pretty transient caches. In this particular case the calculation isn't too 
> heavyweight either so recalculating it in the unlikely event of contention 
> isn't a big deal. In fact, this discussion and the related thinking has 
> made me realise that my original solution was actually sufficient for my 
> somewhat strange use case, which is nice :-). For more typical server side 
> caching, I agree that Guava would be a great solution.
>
> Cheers,
> Colin
>
>
> On 1 September 2014 20:54, Thomas Heller <th.h...@gmail.com <javascript:>> 
> wrote:
>
>> As much as I like Clojure and atoms, I do not think they are a good fit 
>> for caching. Not only is it impossible to address the concurrency issues 
>> related to multiple threads loading the same object, but you also have to 
>> do expiration and size management yourself. Immutability doesn't help much 
>> for caching either. There is core.cache that does some bits but I probably 
>> would recommend using something like CacheBuilder from the guava libs:
>>
>> See
>> https://code.google.com/p/guava-libraries/
>>
>> http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheBuilder.html
>>
>> Its Java but the Clojure<->Java interop is so good that it doesn't matter 
>> much.
>>
>> On Saturday, August 30, 2014 7:27:05 AM UTC+2, Colin Fleming wrote:
>>>
>>> Hi all,
>>>
>>> I want to use a map to cache values based on a key. I'm planning to use 
>>> an atom for this. My basic operation is "give me the value for this key" - 
>>> if the value exists in the map then that value should be returned, 
>>> otherwise a new value should be calculated, inserted in the map and then 
>>> returned. My plan is to implement something like the following:
>>>
>>>
>>> (defn ensure [cache key]  (if (contains? cache key)    cache    (assoc 
>>> cache key (calc-value key))))(let [value (get (swap! cache ensure key) 
>>> key)]  ... do my thing with value ...)
>>>
>>>
>>> So 'ensure' ensures that the cache contains the value for key, the swap! 
>>> operation returns the cache with the value and then I get it out. This 
>>> works but feels a little clumsy, is there a better way to do this?
>>>
>>> Also, looking at the Atom source code, I see that this will cause a CAS 
>>> operation even if the value returned from swap! is identical to the 
>>> original value. It seems like a reasonable optimisation would be to check 
>>> if the values are identical and not update if so - is there a reason this 
>>> might not be a good idea?
>>>
>>> Thanks,
>>> Colin
>>>
>>  -- 
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clo...@googlegroups.com 
>> <javascript:>
>> Note that posts from new members are moderated - please be patient with 
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@googlegroups.com <javascript:>
>> For more options, visit this group at
>> http://groups.google.com/group/clojure?hl=en
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "Clojure" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to clojure+u...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to