【问题标题】:Concurrent blocking map with entries eviction具有条目驱逐的并发阻塞映射
【发布时间】:2014-01-15 02:14:48
【问题描述】:

我需要的是一个相当复杂的数据结构,具有以下要求:

  1. 它应该支持并发读/写而没有任何过度锁定(如java.util.concurrent.ConcurrentHashMap

  2. 它应该有容量限制,一旦达到限制就会阻塞(就像BlockingQueue 实现一样)

  3. 它应该有高效的搜索机制,比如Map/HashSet do:给定一个对象的ID,我需要能够在没有顺序扫描的情况下找到它。

  4. 应该可以在超时时驱逐元素,例如:如果一个条目被放入这个结构中超过X分钟前,它应该被自动删除。

当然,我总是有机会自己实现它,但我更愿意找到现有的、优化的和经过良好测试的东西。

唯一靠近的是 Guava 的缓存,但它似乎缺少 #2。关于此已知实现的任何想法?

【问题讨论】:

  • 应该优化什么for
  • 您确实在要求一些与缓存非常相似的东西。我现在有一个类似的请求,我遇到了 Google ConcurrentLinkedHashMap / Caffeine。看起来很有希望。我会试一试,然后告诉你。

标签: java collections concurrency guava


【解决方案1】:

您可以编写一个简单的 BlockingCache,它包装现有的 Guava 缓存并检查 put 操作的容量,因此 put 看起来像这样:

public V put(K key, V value)
{
    while (size() >= capacity) Thread.sleep(100);
    return innerCache.put(key, value);
}

【讨论】:

    猜你喜欢
    • 2012-06-19
    • 1970-01-01
    • 2016-02-21
    • 2018-11-15
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    相关资源
    最近更新 更多