19、LoadingCache

1、介绍

LoadingCache是Google guava包下的本地缓存功能 com.google.common.cache。

原理类似于hashmap,如果缓存中没有对应的结果,则调用load方法去请求加载

特别是缓存一些MySQL中不怎么修改的参数信息,可以大大减少查询次数

注意:load方法返回的结果不能为null,否则会报错,可以使用Optional来封装结果

2、代码demo

  • 1、maven依赖

      <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
      <dependency>
          <groupId>com.google.guava</groupId>
          <artifactId>guava</artifactId>
          <version>22.0</version>
      </dependency>
    
  • 2、代码示例

      package com.surfilter.mass;
    
      import com.google.common.cache.*;
    
      import java.util.Optional;
      import java.util.concurrent.TimeUnit;
    
      /**
       * [@Author](https://my.oschina.net/arthor) liufu
       * @CreateTime 2018/4/9  18:17
       */
      public class LoadingCacheTest {
          public static void main(String[] args) {
              LoadingCache<String, Optional<String>> cache = CacheBuilder.newBuilder()
                      //设置并发级别为8,并发级别是指可以同时写缓存的线程数
                      .concurrencyLevel(8)
                      //设置写缓存后8秒钟过期
                      .expireAfterWrite(8, TimeUnit.SECONDS)
                      //设置缓存容器的初始容量为10
                      .initialCapacity(10)
                      //设置缓存最大容量为100,超过100之后就会按照LRU最近虽少使用算法来移除缓存项
                      .maximumSize(100)
                      //设置要统计缓存的命中率
                      .recordStats()
                      //设置缓存的移除通知
                      .removalListener(new RemovalListener<Object, Object>() {
                          [@Override](https://my.oschina.net/u/1162528)
                          public void onRemoval(RemovalNotification<Object, Object> notification) {
                              System.out.println(notification.getKey() + " was removed, cause is " + notification.getCause());
                          }
                      })
                      //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存
                      .build(new CacheLoader<String, Optional<String>>() {
                                 [@Override](https://my.oschina.net/u/1162528)
                                 public Optional<String> load(String key) throws Exception {
                                     return Optional.ofNullable(loadRealData(key));
                                 }
                             }
                      );
    
    
              //报空指针异常,不能传入null
              //Optional<String> optional = cache.getUnchecked(null);
              System.out.println(cache.getUnchecked("liufu").orElse("默认值"));
              System.out.println(cache.getUnchecked("aaliuf").orElse("默认值"));
              //debug发现,这一行没有进入下面的loadRealData方法
              System.out.println(cache.getUnchecked("aaliuf").orElse("默认值"));
          }
    
          public static String loadRealData(String key){
              if (key.startsWith("aa")){
                  return key;
              }
              return null;
          }
      }
    

转载于:https://my.oschina.net/liufukin/blog/2222474

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值