• Google Guava Cache LoadingCache 基本使用


    一. 添加依赖

    1. <dependency>
    2. <groupId>com.google.guava</groupId>
    3. <artifactId>guava</artifactId>
    4. <version>27.1-jre</version>
    5. </dependency>

    二. 创建CacheLoader

    1. LoadingCache<Long, String> cache = CacheBuilder.newBuilder()
    2. //缓存池大小,在缓存项接近该大小时, Guava开始回收旧的缓存项
    3. .maximumSize(GUAVA_CACHE_SIZE)
    4. //设置过期策略
    5. .expireAfterWrite(10, TimeUnit.MINUTES)
    6. //设置刷新策略
    7. .refreshAfterWrite(10, TimeUnit.MINUTES)
    8. //移除监听器,缓存项被移除时会触发
    9. .removalListener(new RemovalListener <Long, String>() {
    10. @Override
    11. public void onRemoval(RemovalNotification<Long, String> rn) {
    12. //执行逻辑操作
    13. }
    14. })
    15. //开启Guava Cache的统计功能
    16. .recordStats()
    17. .build(cacheLoader);

    1. CacheLoader<String, String> cacheLoader = new CacheLoader<String, String>() {
    2. //expire后或第一次加载时 调用
    3. @Override
    4. public String load(String key) throws Exception {
    5. return "";
    6. }
    7. //refresh时调用
    8. @Nullable
    9. @Override
    10. public ListenableFuture<String> reload(String key, HostInfo oldValue) throws Exception {
    11. return super.reload(key, oldValue);
    12. }
    13. };

    三.配置

    1.expireAfterAccess(long, TimeUnit)

    缓存项在给定时间内没有被读/写访问,则回收。请注意这种缓存的回收顺序和基于大小回收一样,再次加载key,调用CacheLoader的load方法。

    2.expireAfterWrite(long, TimeUnit)

    缓存项在给定时间内没有被写访问(创建或覆盖),则回收。如果认为缓存数据总是在固定时候后变得陈旧不可用,这种回收方式是可取的,再次加载key,调用CacheLoader的load方法。

    3.refreshAfterAccess(long duration, TimeUnit unit)

    缓存项在给定时间内没有被读/写访问,则刷新,再次加载key,调用CacheLoader的reload方法。

    4.refreshAfterWrite(long duration, TimeUnit unit)

    缓存项在给定时间内没有被写访问(创建或覆盖),则刷新,再次加载key,调用CacheLoader的reload方法。

    因为load是同步加载,reload是异步加载。
    expire load的优点:失效后下次查询是实时的数据。
    缺点:如果大量缓存同时失效,查询耗时会比较长。

    refresh reload的优点:reload是异步的,查询会很快返回。
    缺点:当数据到达失效时间时,会先返回上次的value,当reload完成后再会返回实时的数据,数据实时性低于load。

    综合使用

    CacheBuilder.newBuilder().expireAfterWrite(timeOut, TimeUnit.MINUTES).expireAfterWrite(timeOut+ expireTime, TimeUnit.MINUTES);
    

    timeOut内访问数据会使用reload加载数据,在超过timeOut+ expireTime内访问数据会使用load加载数据。

    四.Caffeine

    https://www.oschina.net/p/ben-manes-caffeine?hmsr=aladdin1e1
    Caffeine 是基于Java 8的高性能,接近最佳的缓存库。 Caffeine使用Google Guava启发的API提供内存缓存。
    性能上优于Guava Cache,使用方法类似。



    作者:摩V羯座
    链接:https://www.jianshu.com/p/41c683242b33
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    ubuntu20 extundelete 不能工作
    python类的构造函数__init__方法
    融云「 IM 进阶实战高手课」系列直播上线
    Linux shell编程学习笔记30:打造彩色的选项菜单
    springboot集成canal实现同步双写
    无胁科技-TVD每日漏洞情报-2022-9-13
    【技术】BootStrapTable 滚动条控制
    百度echarts区域阴影实现
    第二十二篇:稳定性之服务等级协议
    交换机和路由器基础
  • 原文地址:https://blog.csdn.net/zdwzzu2006/article/details/134261609