资讯专栏INFORMATION COLUMN

有用的Guava(二)

Tonny / 785人阅读

摘要:最基本的区别是会一直保存所有添加的元素,直到显式地移除。相对地,为了限制内存占用,通常都设定为自动回收元素。消息接收方消息发起方同步异步注册事件触发事件处理这个错误可能是由于中对应方法抛出了异常。

缓存

Guava Cache提供了内存缓存功能。内存缓存需要考虑很多问题,包括并发问题,缓存失效机制,内存不够用时缓存释放,缓存的命中率,缓存的移除等等。 当然这些东西Guava都考虑到了。
Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。相对地,Guava Cache为了限制内存占用,通常都设定为自动回收元素。
使用方法如下:

LoadingCache cache = CacheBuilder.newBuilder()  
      .maximumSize(10000)
      .expireAfterWrite(10, TimeUnit.SECONDS)
      //统计缓存的命中率
      .recordStats()
      //缓存被移除时收到通知
      .removalListener(new RemovalListener() {
                    @Override
                    public void onRemoval(RemovalNotification notification) {
                        System.out.println(notification.getKey() + " was removed, cause is " + notification.getCause());
                    }
                })
      //build方法中指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存
      .build(new CacheLoader() {
          @Override
          public Student load(String key) throws Exception {
              return createStudentByKey(key);
              }
          });

这样就得到一个缓存对象,可以对其进行操作了:

 //获取缓存项
 Object value = cache.get("key");
 //获取缓存的命中率等状态;
 cache.stats();

也可以在get()时定义数据加载源:

    Cache cache = CacheBuilder.newBuilder().maximumSize(1000).build();
    Object value = cache.get("key", new Callable() {
                            public Object call() {
                                createStudentByKey(key);
                                }
                           });

guava的内存缓存非常强大,可以设置各种选项,使用方便。
另外还提供了下面一些方法,来方便各种需要:
--ImmutableMap getAllPresent(Iterable keys) 一次获得多个键的缓存值
--put和putAll方法向缓存中添加一个或者多个缓存项
--invalidate 和 invalidateAll方法从缓存中移除缓存项
--asMap()方法获得缓存数据的ConcurrentMap快照
--cleanUp()清空缓存
--refresh(Key) 刷新缓存,即重新取缓存数据,更新缓存

EventBus

EventBus是Guava框架对观察者模式的一种实现,使用EventBus可以很简洁的实现事件注册监听和消费。Guava框架里面提供了两种相关的实现,一种是单线程同步事件消费,另外一直是多线程异步事件消费。
消息接收方:

public class Event {
    @Subscribe
    public void sub(String message) {
        System.out.println(message);
    }

}

消息发起方:

    public void testEventBus() {
        //同步
        EventBus eventBus = new EventBus();
        //异步
        //AsyncEventBus eventBus = new AsyncEventBus(Executors.newFixedThreadPool(3));
        eventBus.register(new Event());//注册事件
        eventBus.post("ssdf");// 触发事件处理
    }

ps:
com.google.common.eventbus.EventBus$LoggingSubscriberExceptionHandler.handleException Could not dispatch event: XXX
这个错误可能是由于lister中@Subscribe对应方法抛出了异常。

参考资料

http://ifeve.com/google-guava...
https://github.com/google/gua...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70366.html

相关文章

  • Guava 源码分析(Cache 原理【阶段】)

    摘要:前言在上文源码分析原理中分析了的相关原理。我在北京模拟执行你在哪儿回复最后执行结果开始提问提问完毕,我去干其他事了收到消息你在哪儿等待响应中。。。。。回复我在北京这样一个模拟的异步事件回调就完成了。 showImg(https://segmentfault.com/img/remote/1460000015643387?w=2048&h=1150); 前言 在上文「Guava 源码分析...

    msup 评论0 收藏0
  • Guava 源码分析(Cache 原理【阶段】)

    摘要:前言在上文源码分析原理中分析了的相关原理。我在北京模拟执行你在哪儿回复最后执行结果开始提问提问完毕,我去干其他事了收到消息你在哪儿等待响应中。。。。。回复我在北京这样一个模拟的异步事件回调就完成了。 showImg(https://segmentfault.com/img/remote/1460000015643387?w=2048&h=1150); 前言 在上文「Guava 源码分析...

    dack 评论0 收藏0
  • 有用guava(一)

    摘要:尼古拉斯沃兹基硕德我们已经有了,为什么还需要另外一个库呢因为好用呗日常编码中经常会遇到下面的代码经过的修剪后可以变成这样甚至这样其实这种结构,就是一个二维映射,把它包装成了。但的完美处理双向映射。当然,在使用时,会要求的唯一性。 Google Guava是把小巧又锋利的瑞士军刀,把你的代码修剪得整洁又漂亮。-------------尼古拉斯·沃兹基硕德 1. Google Collec...

    张宪坤 评论0 收藏0
  • 集中式内存缓存 Guava Cache

    摘要:缓存总体可分为两种集中式缓存和分布式缓存集中式缓存与分布式缓存的区别其实就在于集中与非集中的概念,其对象可能是服务器内存条硬盘等。内存条版本缓存集中在一台服务器的一条内存条上,为集中式缓存。 背景 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用。在日长开发有很多场合,有一些数据量不是很大,不会经常改动,并且访问非常频繁。但是由于受限于硬盘IO的性能或者远程...

    Dean 评论0 收藏0
  • 集中式内存缓存 Guava Cache

    摘要:缓存总体可分为两种集中式缓存和分布式缓存集中式缓存与分布式缓存的区别其实就在于集中与非集中的概念,其对象可能是服务器内存条硬盘等。内存条版本缓存集中在一台服务器的一条内存条上,为集中式缓存。 背景 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用。在日长开发有很多场合,有一些数据量不是很大,不会经常改动,并且访问非常频繁。但是由于受限于硬盘IO的性能或者远程...

    KitorinZero 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<