ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 具有过期的不可变集合

2019-08-25 03:01:58  阅读:181  来源: 互联网

标签:java guava


我在做什么:我正在收集一个潜在的大型对象集合,并要求用户根据集合进行输入.我想缓存对象以避免重新获取它们,但我希望收集在短时间后过期以防用户散失.如果需要,我会重新获取对象.该集合不会在所涉及的短时间内发生变化.

我看过的内容:由于基于时间的过期,Guava’s Cache看起来很有希望.然而,有几件事让我感到困扰.我真的不需要地图 – 集合将被完整访问或根本不访问.而且我担心我会遇到竞争条件,当我访问缓存时,缓存中的项目开始到期.这增加了一定程度的复杂性,必须跟踪我的所有项目是否都在缓存中,从而消除了缓存的一些价值.

我的问题:如果我不是将单个项目放在缓存中,而是将它们放入一个Guava ImmutableCollection并将其放入缓存中,我是否会遇到麻烦?这似乎是我一次访问整个集合的方式,并且集合在缓存中或者不在(在这种情况下我重建它).我没有看到这种方法存在的缺陷吗?

解决方法:

为Guava缓存提供静态单例密钥并不罕见.即使不用作Map,Cache也可以提供很多好处.我会做这样的事情:

 private static final Object CACHE_KEY = new Object();

 private LoadingCache<Object, List<SomeType>> cache = 
      CacheBuilder.newBuilder()
        .expireAfterWrite(5, TimeUnit.MINUTES)
        .softValues()
        .build(valuesLoader());

 //...
 List<SomeType> values = cache.get(CACHE_KEY);

在我的代码库中,我在几个地方使用具有单个值的缓存,因此我将其抽象为SingleValueLoadingCache< T>它公开了一个no-arg get()方法并封装了缓存和密钥.

It seems that way I access the entire collection in one go, and the collection is either in the cache or it isn’t (in which case I rebuild it all). Are there pitfalls with this approach that I’m not seeing?

如果您还没有找到它,您可能需要通过将CacheLoader传递给CacheBuilder的构建方法来加载Loading.这样你只需要调用get(),如果值不在缓存中,则使用你提供的CacheLoader自动和同步地为你加载它.

标签:java,guava
来源: https://codeday.me/bug/20190825/1714630.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有