最近在做一些缓存改造的场景,有如下一些经验总结:

    缓存版本:

    Ehcache:2.8.3
    Guava:17.0

    1. Ehcache支持持久化到本地磁盘,Guava不可以;
    2. Ehcache有现成的集群解决方案,Guava没有。不过个人感觉比较鸡肋,对JVM级别的缓存来讲太重了;
    3. Ehcache jar包庞大,Guava Cache只是Guava jar包中的工具之一,而且后者远远小于Ehcache;
    4. 两种缓存当缓存过期或者没有命中的时候都可以通过load接口重载数据,调用方式略有不同。两者的主要区别是Ehcache的缓存load的时候,允许用户返回null,而Guava Cache则不允许返回为null,因为Guava Cache是根据value的值是否为null来判断是否需要load,所以不允许返回为null,但是使用的时候可以使用空对象替换。不允许返回null是一个很好的考虑;
    5. Ehcache有内存占用大小统计,Guava Cache没有,需要自己开发;
    6. Ehcache在put缓存的时候,对K、V都做了包装,对GC有一定影响。

    什么时候适用Ehcache、什么时候适用Guava cache?

    首先,两者都是很成熟的JVM级别缓存,所以在绝大多数情况都是可以满足要求的。

    适用Ehcache的情况

    1. 需要持久化持久化。使用持久化功能需要,缓存稳定,以免持久化的数据不准确影响结果。
    2. 有集群解决方案。

    适用Guava cache的情况
    Guava cache说简单点就是一个支持LRU的ConCurrentHashMap,它没有Ehcache那么多的各种特性,只是提供了增、删、改、查、刷新规则和时效规则设定等最基本的元素。做一个jar包中的一个功能之一,Guava cache极度简洁并能满足觉大部分人的要求。

    总结
    Ehcache有着全面的缓存特性,但是略重。Guava cache有最基本的缓存特性,很轻。大家根据具体情况选择使用。