我有一个哈希图,它存储大约 1 G 的数据是键值对的术语。此哈希图每 15 天更改一次。它将被加载到内存中并从那里使用。
当必须将新的 hashmap 加载到内存中时,会有多个事务已经在访问内存中的 hashmap。如何在不影响访问旧哈希图的当前事务的情况下用新哈希图替换旧哈希图。如果有办法热交换内存中的哈希图?
使用AtomicReference<Map<Foo, Bar>>
而不是公开对地图的直接(硬)引用。地图的消费者将使用#get()
,当您准备好更换地图时,您的“内部”代码将使用#set()
or #getAndSet()
。
引用分配在 Java 中是原子的,而 volatile 确保可见性。
注意事项:
get(K key)
替代方案,以便用户始终访问最新地图。如果数据量像你的一样大,我会建议使用像 memcached 这样的缓存工具。这样,您可以根据您的要求使单个项目或整个缓存无效。