5

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

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

4

3 回答 3

3

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

于 2013-07-30T07:04:23.537 回答
1
  1. 为地图提供吸气剂
  2. 将地图标记为私有且易变
  3. 更新地图时,创建一个新地图,填充它,当它准备好时,将其分配给您的私有地图变量。

引用分配在 Java 中是原子的,而 volatile 确保可见性。

注意事项:

  • 在某个阶段,您将在内存中有两张地图
  • 如果某些代码保留对旧地图的引用,它将访问过时的数据。如果这是一个问题,您可以完全隐藏地图并提供get(K key)替代方案,以便用户始终访问最新地图。
于 2013-07-30T07:24:08.477 回答
0

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

于 2013-07-30T07:08:13.433 回答