zoukankan      html  css  js  c++  java
  • Guava中的Cache简易源码分析

    本文是用guava 18.0,本文讨论com.google.common.cache下的Cache

    1、是什么?有什么用?

    Cache是guava提供的一个工具缓存类。我们可以利用他缓存一些信息到本机的内存中。在框架,组件中会经常用到这个功能。例如,缓存一些用户信息

    2、怎样用?

             /**
             * 如何将数据过期?(奇怪的想法,用定时器去删除内存的数据。)
             * 在用户调用get方法的时候,去判断该key是否过期,如果过期就将value进行删除。
             */
            Cache<Object, Object> localCache = CacheBuilder.newBuilder()
                    .maximumSize(1000) // 设置缓存的最大容量
                    .expireAfterWrite(1, TimeUnit.MINUTES)
                    .build();
            localCache.put("testkey","testValue");
            
            System.out.println(localCache.getIfPresent("testkey"));
            
            System.out.println(localCache.get("1", new Callable<Object>() {
                @Override
                public Object call() throws Exception {
                    return "666";
                }
            }));
    
    运行结果为:
    testValue
    666
    

    3、简易源码分析

    3.1、如何保存?

    com.google.common.cache.LocalCache.LocalManualCache#put
    ---》com.google.common.cache.LocalCache#put
    ----》com.google.common.base.Equivalence.Equals#doHash # 拿key.hashCode() 值
    ------》com.google.common.cache.LocalCache#rehash # 对刚刚拿到的key hashcode进行rehash,为什么要这么干?应该是为了将key弄的更加分散些
    -------》com.google.common.cache.LocalCache#segmentFor # 用刚刚得到的hash值,作为segments对象数组的索引(下标),找到对应的segment对象
    --------》com.google.common.cache.LocalCache.Segment#put

    3.2、如何读取?

    3.3、key如何过期?

  • 相关阅读:
    MySQL binlog 组提交与 XA(两阶段提交)
    mydumper 安装报错处理
    安装 gcc-c++ 时报错和原有 gcc 版本冲突
    mysql / mysqld_safe / mysqld 常见错误处理
    Linux 内核日志——dmesg
    Java中的Atomic包
    JAVA NIO中的Channels和Buffers
    字节流InputStream/OutputStream
    字符输出流Writer简要概括
    字符输入流Reader简要概括
  • 原文地址:https://www.cnblogs.com/vingLiu/p/12891380.html
Copyright © 2011-2022 走看看