• guava cache


    适用场景

    缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存。

    Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。相对地,Guava Cache为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。

    通常来说,Guava Cache适用于:

    • 你愿意消耗一些内存空间来提升速度。
    • 你预料到某些键会被查询一次以上。
    • 缓存中存放的数据总量不会超出内存容量。

    guava cache的创建方式:

         1. cacheLoader
      2. callable callback

      通过这两种方法创建的cache,和通常用map来缓存的做法比,不同在于,这两种方法都实现了一种逻辑——从缓存中取key X的值,如果该值已经缓存过了,则返回缓存中的值,如果没有缓存过,可以通过某个方法来获取这个值。但不同的在于cacheloader的定义比较宽泛,是针对整个cache定义的,可以认为是统一的根据key值load value的方法。而callable的方式较为灵活,允许你在get的时候指定。

    cacheLoader:

    @Test
        public void TestLoadingCache() throws Exception{
            LoadingCache<String,String> cahceBuilder= CacheBuilder
                    .newBuilder()
                    .build(new CacheLoader<String, String>(){
                        @Override
                        public String load(String key) throws Exception {
                            String strProValue=key+System.currentTimeMillis();
                            return strProValue;
                        }
    
                    });
    
            System.out.println("jerry value:"+cahceBuilder.get("jerry"));
            System.out.println("peida value:"+cahceBuilder.get("peida"));
            cahceBuilder.put("harry", "ssdded");
            System.out.println("harry value:"+cahceBuilder.get("harry"));
        }

    callable callback

     @Test
        public void testCallableCache()throws Exception{
            Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000).build();
            String resultVal = cache.get("jerry", new Callable<String>() {
                public String call() {
                    String strProValue="hello "+"jerry"+"!"+System.currentTimeMillis();
                    return strProValue;
                }
            });
            System.out.println("jerry value : " + resultVal);
    
            resultVal = cache.get("peida", new Callable<String>() {
                public String call() {
                    String strProValue="hello "+"peida"+"!"+System.currentTimeMillis(;
                    return strProValue;
                }
            });
            System.out.println("peida value : " + resultVal);
        }

    一个完整的例子

    LoadingCache<String, String> cahceBuilder = CacheBuilder
                    .newBuilder()
                    .maximumSize(2)
                    .weakKeys()
                    .softValues()
                    .refreshAfterWrite(120, TimeUnit.SECONDS)
                    .expireAfterWrite(10, TimeUnit.MINUTES)
                    .removalListener(new RemovalListener<String, String>() {
                        @Override
                        public void onRemoval(RemovalNotification<String, String> rn) {
                            System.out.println(rn.getKey() + "被移除");
    
                        }
                    })
                    .build(new CacheLoader<String, String>() {
                        @Override
                        public String load(String key) throws Exception {
                            return "hello " + key + "!"+System.currentTimeMillis();
                        }
    
                    });
    
            System.out.println("jerry value:" + cahceBuilder.get("jerry"));
            System.out.println("peida value:" + cahceBuilder.get("peida"));
            cahceBuilder.put("harry", "ssdded");
            System.out.println("harry value:" + cahceBuilder.get("harry"));

    cache的参数说明:

      回收的参数:
      1. 大小的设置:CacheBuilder.maximumSize(long)  CacheBuilder.weigher(Weigher)  CacheBuilder.maxumumWeigher(long)
      2. 时间:expireAfterAccess(long, TimeUnit) expireAfterWrite(long, TimeUnit)
      3. 引用:CacheBuilder.weakKeys() CacheBuilder.weakValues()  CacheBuilder.softValues()
      4. 明确的删除:invalidate(key)  invalidateAll(keys)  invalidateAll()
      5. 删除监听器:CacheBuilder.removalListener(RemovalListener)
      

      refresh机制:
      1. LoadingCache.refresh(K)  在生成新的value的时候,旧的value依然会被使用。
      2. CacheLoader.reload(K, V) 生成新的value过程中允许使用旧的value
      3. CacheBuilder.refreshAfterWrite(long, TimeUnit) 自动刷新cache

  • 相关阅读:
    面向对象、面向接口、面向方法编程的区别?
    面向接口、对象、方面编程区别 -- 精简版
    面向接口编程详解(一)——思想基础
    吴裕雄--天生自然数据结构:静态链表及其创建
    吴裕雄--天生自然数据结构:单链表的基本操作
    吴裕雄--天生自然数据结构:单链表,链式存储结构
    吴裕雄--天生自然数据结构:顺序表的基本操作
    吴裕雄--天生自然Python Matplotlib库学习笔记:matplotlib绘图(2)
    吴裕雄--天生自然Python Matplotlib库学习笔记:matplotlib绘图(1)
    吴裕雄--天生自然Numpy库学习笔记:NumPy Matplotlib
  • 原文地址:https://www.cnblogs.com/duanxingxing/p/5577729.html
Copyright © 2020-2023  润新知