Guava Cache - 最大大小 - 逐出(LRU 或最常见)

TJ-*_*TJ- 5 caching guava

我计划在我的应用程序中使用 Guava Cache。某些被访问的[K, V]对在统计上比其他对 > > 并且应该在缓存中基本上始终可用。

根据基于大小的驱逐规范

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

我试图理解最常见的部分。我可以假设 - 对于 的缓存maximumSize = 100,如果Key_A被访问10000次数并立即发布有100put 调用,则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);
    }
}
Run Code Online (Sandbox Code Playgroud)

测试

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?"
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Mah*_*dra 2

根据我的轻描淡写,Guava Cache使用 LRU 作为默认驱逐策略

在您的情况下,当您添加 10 个新值时,键“0”的条目成为最旧的值,因此当缓存达到其最大大小时,最旧的值将被逐出。