番石榴缓存 - maximumSize - 驱逐(LRU或最常见)

时间:2014-07-24 21:25:35

标签: caching guava

我打算在我的应用程序中使用Guava Cache。访问的一些 [K,V] 对在统计上是>>比其他人更多,并且应该始终在缓存中可用。

根据Sized Based Eviction

的规格
  

如果您的缓存不应超过一定的大小,请使用   CacheBuilder.maximumSize(长)。缓存将尝试逐出条目   最近或经常使用的

我想了解经常部分。我可以假设 - 对于maximumSize = 100的缓存,如果Key_A被访问10000次,并且立即发布100次来电话,则Key_A仍会出现在缓存中?我进行的基本单元测试似乎没有证实这个事实。 有什么想法吗?

public class CacheHelper
{
    private Cache<String, String> cache;
    public CacheHelper()
    {
        cache = CacheBuilder.newBuilder().maximumSize(10).concurrencyLevel(1).build();
    }

    public String fetchVal(String key)
    {
        String val = cache.getIfPresent(key);
        return val;
    }

    public void putVal(String key, String val)
    {
        cache.put(key, val);
    }
}

测试

public class CacheTest
{
    public static void main(String[] args)
    {
        CacheHelper cacheHelper = new CacheHelper();
        cacheHelper.putVal("0", "0");
        for(int i = 0; i < 10000; i++)
        {
            cacheHelper.fetchVal("0");
        }
        System.out.println(cacheHelper.fetchVal("0"));
        for(int i = 1; i < 11; i++)
        {
            String key = "" + i;
            cacheHelper.putVal(key, key);
        }
        System.out.println(cacheHelper.fetchVal("0"));  // Still returns NULL - "most often not being used?"
    }
}

由于

2 个答案:

答案 0 :(得分:1)

根据我的不足Guava Cache使用LRU作为默认驱逐政策

在您的案例中输入密钥&#34; 0&#34;当您添加10个新值时,它变为最旧的值,因此当缓存达到其最大大小时,最旧的值被逐出。

答案 1 :(得分:0)

问题在于番石榴规格通常或最近&#34;在你的情况下,1到10键比0键更重要。 这就是为什么0键已经消失的原因。

如果性能对您很重要,请尝试使用缓存加载器。由于加载器,番石榴可以确定加载值的延迟并保持在内存中最有用的&#34;有用的&#34;项目