gpt4 book ai didi

java - Java中基于平面文件的内存读/写缓存

转载 作者:行者123 更新时间:2023-12-01 16:58:03 27 4
gpt4 key购买 nike

我有一个包含设备标识符列表的平面文件。当我的基于 Java/tomcat 的应用程序收到来自特定设备的请求时,它会根据文件中是否存在设备标识符来决定业务逻辑(即使设备存在,设备标识符可能会或可能不会出现在文件中)。此外,还有一些用例

  1. 需要将新标识符添加到文件中
  2. 可以从文件中删除标识符。

为了使(多线程)应用程序更快,我需要将内容存储在内存中,而不是每次读/写操作都直接访问文件。

以下是要求(摘要):

  1. 在应用程序启动期间读取内存(缓存)中的文件内容。

  2. 以多线程方式从缓存中读取内容。如果缓存中不存在内容,则文件中不应该存在内容,反之亦然(单点事实)。

  3. 当有新的设备标识时,缓存和文件都需要更新。

  4. 当需要删除设备标识时,缓存和文件都需要更新。

  5. 应用程序在 Java 中运行。

有哪些可用选项?我最初想到使用 gauva 缓存。但是,我不确定它是否支持将其内容写回源文件。即使是一个简单的属性文件(java.util.properties)也应该这样做。但是,不确定这是否适合高度多线程环境。

感谢您的建议。

最佳答案

与大多数缓存一样,Guava 的设计主要以读取方式使用。目的是更新权威数据源,然后使缓存失效。缓存不支持直写或后写,在顶部添加这些功能可能会导致微妙的竞争条件。

Java 8 重写,Caffeine ,支持通过 ConcurrentHashMap's 添加该功能原子计算方法。直写使用更新数据源的计算,如果成功,则将值存储在缓存中。 write-behind 使用 compute 方法异步更新数据源并将值乐观地存储在缓存中。在这两种情况下,如果计算期间存在该条目,则读取是非阻塞的并接收旧值,直到更新完成。

直写式和后写式都不是内存中缓存常见用途的好方法。在适当的时候,它们需要更周到的照顾和定制,因此提供通用支持被认为会导致开发人员误入歧途并且几乎没有什么好处。重写提供了使该功能成为可能的机会,而无需直接推广它。

关于java - Java中基于平面文件的内存读/写缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30050497/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com