zoukankan      html  css  js  c++  java
  • Guava Cache使用的三种姿势

    姿势一

    使用expiredAferWriter
    

    优点

    • 简单
    • 粗暴

    缺点

    • 同步阻塞问题:如果多个线程同时请求同一个过期的key,只有一个线程能够获得去加载缓存的锁,但是其他未获取加载缓存锁的线程也会阻塞。

    show me the code

    image


    姿势二

    使用expiredAfterWrite + refreshAfterWrite
    

    使用注意

    指定refreshAferWrite的时间小于expiredAfterWrite
    必须使用LoadingCache
    直接使用get获取缓存
    

    优点

    • 当到达刷新时间之后,只会有一个线程获得刷新缓存的锁,其他线程直接返回缓存中的旧值,仅阻塞刷新缓存的线程

    缺点

    • 刷新缓存的线程还是会被阻塞

    show me the code

    image


    姿势三

    使用expiredAfterWrite + refreshAfterWrite + ListenableFuture
    

    优点

    • 刷新缓存的线程也不会被阻塞,而是直接返回

    缺点

    • 刷新缓存的线程得到的仍然是旧值
    • 缓存的刷新或者重新加载还是得靠外部请求触发,不能完全达到定时刷新效果
      image

    注意

    1. 不管上面那种方式,缓存的加载和刷新都需要外部调用(get)才触发
    2. 使用姿势二和三要注意缓存的刷新过期时间要设置的比加载过期时间短,否则体现不出优势
    3. 如果当前请求缓存时间距离最后一次时间已经超过过期时间,则会调用加载(load)方法而非刷新(reload)方法来加载缓存,此时会回退到姿势一
    4. 刷新缓存的同时也会刷新缓存下次过期的时间(在当前时间累加过期时间)
    5. 具体逻辑参照**com.google.common.cache.LocalCache$Segment**。这里贴出一些关键逻辑供各位参考:
    

    image

    只有在value!=null的时候(既未达到过期时间时)才会调用refresh方法
    

    image
    image
    image

    注册了一个Listener来实现异步刷新
    黎明前最黑暗,成功前最绝望!
  • 相关阅读:
    property 中的strong 与weak
    ios5 StoryBoard
    PLINQ中的分区
    ZOJ3704 I am Nexus Master! 模拟
    POJ1470 Closest Common Ancestors TarjanLCA
    XTU1170 Coin 线段树
    HDU2586 How far away ? LCATarjan Or spfa
    CF#303C Minimum Modular 数学分析
    CF#303B Rectangle Puzzle II 数学分析
    ZOJ3698 Carrot Fantasy 恶心模拟
  • 原文地址:https://www.cnblogs.com/Kidezyq/p/15045465.html
Copyright © 2011-2022 走看看