当前位置: 首页 > 面试题库 >

具有过期密钥的基于Java时间的地图/缓存

张星洲
2023-03-14
问题内容

你是否知道在给定超时后会自动清除条目的Java Map或类似标准数据存储?这意味着老化,旧的过期条目会自动“老化”。

最好在可通过Maven访问的开源库中?

我知道自己实现该功能的方法,并且过去已经做过几次,所以我并不是在这方面寻求建议,而是寻求指向一个好的参考实现的指针。

像WeakHashMap这样的基于WeakReference的解决方案不是一个选择,因为我的密钥很可能是非interintern字符串,并且我希望可配置的超时时间不依赖于垃圾回收器。

我也不想依靠Ehcache,因为它需要外部配置文件。我正在寻找仅代码解决方案。


问题答案:

是。Google Collections或Guava的名称现在有了一个叫做MapMaker的东西,可以做到这一点。

ConcurrentMap<Key, Graph> graphs = new MapMaker()
   .concurrencyLevel(4)
   .softKeys()
   .weakValues()
   .maximumSize(10000)
   .expiration(10, TimeUnit.MINUTES)
   .makeComputingMap(
       new Function<Key, Graph>() {
         public Graph apply(Key key) {
           return createExpensiveGraph(key);
         }
       });

更新:

从guava 10.0(2011年9月28日发布)开始,许多MapMaker方法已被弃用,以支持新的CacheBuilder:

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
    .maximumSize(10000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .build(
        new CacheLoader<Key, Graph>() {
          public Graph load(Key key) throws AnyException {
            return createExpensiveGraph(key);
          }
        });


 类似资料:
  • 原始关闭原因未解决 你们知道Java Map或类似的标准数据存储在给定的超时后自动清除条目吗?这意味着老化,旧的过期条目会自动“老化”。 最好是在可以通过Maven访问的开源库中? 我知道自己实现功能的方法,并且在过去已经做了几次,所以我不是在征求这方面的建议,而是寻求一个好的参考实现的指针。 基于WeakReference的解决方案(如WeakHashMap)不是一个选项,因为我的密钥可能是非内

  • 问题内容: 我的代码如下所示: 它的作用是,将键值存储23小时。但是,有什么方法可以设置密钥在晚上11:59 pm过期? 问题答案: Redis本身不提供此功能。但是您可以计算直到午夜的秒数。

  • 问题内容: 当生存时间达到0时,我的Redis服务器不会删除密钥。 这是一个示例代码: 如果我通过redis检查信息返回,它说0个密钥已过期。 任何想法? 谢谢。 问题答案: 由于您正在执行“ …”,因此很难确定,但是我要说的是您在该部分设置了mykey,这将有效地消除过期。 从EXPIRE手册 仅当使用DEL命令删除密钥或使用SET或GETSET命令覆盖密钥时,才清除超时 另外,关于TTL的-1

  • 这是我的密码 抱歉,如果我的代码一团糟。

  • 我想创建一个像下面这样的地图- 我有一张物品清单- 这里Pair是一个类,已经在我的项目中,所以我想使用它。 我需要帮助从Java8流创建它。 我试过了: 但我犯了个错误。我刚刚接触Java 8,正在努力学习它。 添加一个示例: 我有一个

  • 问题内容: 当我的密钥在Redis数据存储区中过期时,我正在尝试使用Redis实施过期密钥通知。redis网站提供了一些有关http://redis.io/topics/notifications的描述,但是我无法找到任何示例,例如使用Jedis的redis java客户端如何做到这一点? 任何可能的带有插图的代码都将非常有用,因为它们是redis的新功能。 问题答案: 您只能使用 pub-sub