替换AS中的大型哈希映射

时间:2013-07-30 07:02:30

标签: java hashmap

我有一个散列图,它存储大约1 G的数据是键值对的术语。此hashmap每15天更改一次。它将被加载到内存中并从那里使用。

当必须将新的hashmap加载到内存中时,会有几个事务已经在内存中访问hashmap。如何在不影响访问旧hashmap的当前事务的情况下,用新的hashmap替换旧的hashmap。如果有办法在内存中热插拔hashmap?

3 个答案:

答案 0 :(得分:3)

使用AtomicReference<Map<Foo, Bar>>而不是直接(硬)引用地图。地图的使用者将使用#get(),当您准备换出地图时,您的“内部”代码将使用#set()#getAndSet()

答案 1 :(得分:1)

  1. 向地图提供吸气剂
  2. 将地图标记为private and volatile
  3. 更新地图时,请创建一个新地图,填充它并准备就绪后,将其分配给您的私有地图变量。
  4. 参考分配在Java中是原子的,而volatile确保可见性。

    注意事项:

    • 在某个阶段你将在内存中有两张地图
    • 如果某些代码保留对旧地图的引用,它将访问陈旧数据。如果这是一个问题,您可以完全隐藏地图并提供get(K key),以便用户始终访问最新地图。

答案 2 :(得分:0)

如果数据大小和你的一样大,我建议使用像memcached这样的缓存工具。这样,您可以根据您的要求使单个项目或整个缓存无效。