Java快速数据存储&;检索

Java快速数据存储&;检索,java,Java,我需要将记录存储到持久性存储器中,并根据需要检索它。要求如下: 极快的检索和插入 每个记录都有一个唯一的键。此键将用于检索记录 存储的数据应该是持久的,即JVM重启时应该可用 一个单独的过程将每天一次将过时的记录移动到RDBMS 你们觉得怎么样?由于延迟问题,我无法使用标准数据库。像HSQLDB/H2这样的内存数据库有性能限制。此外,记录是简单的字符串对象,不符合SQL。我正在考虑某种基于平面文件的解决方案。有什么想法吗?有开源项目吗?我敢肯定,一定有人以前解决过这个问题。使用碎片的MySQL可

我需要将记录存储到持久性存储器中,并根据需要检索它。要求如下:

  • 极快的检索和插入
  • 每个记录都有一个唯一的键。此键将用于检索记录
  • 存储的数据应该是持久的,即JVM重启时应该可用
  • 一个单独的过程将每天一次将过时的记录移动到RDBMS

  • 你们觉得怎么样?由于延迟问题,我无法使用标准数据库。像HSQLDB/H2这样的内存数据库有性能限制。此外,记录是简单的字符串对象,不符合SQL。我正在考虑某种基于平面文件的解决方案。有什么想法吗?有开源项目吗?我敢肯定,一定有人以前解决过这个问题。

    使用碎片的MySQL可能是个好主意。但是,这取决于所需的数据量、每秒事务数和延迟


    内存数据库也是一个好主意。事实上,MySQL也提供基于内存的表。

    您是否已经证明使用进程外SQL数据库(如MySQL或SQL Server)速度太慢,或者这是一种假设

    您可以将SQL数据库方法与内存缓存结合使用,以确保检索不会命中数据库。尽管记录是纯文本的,但我仍然建议使用SQL而不是平面文件解决方案(例如,在表模式中使用文本列),因为RDBMS将执行文件系统无法执行的优化(例如,缓存最近访问的页面等)


    但是,如果没有关于您的访问模式、预期吞吐量等的更多信息,我无法提供更多的建议。

    您需要的所有记录和密钥是否可以同时放入内存?如果是这样,您可以使用HashMap,因为它是可序列化的。

    如果您丢失一两条记录,这有多重要?他们从哪里来?您是否与源有交易关系

    如果您有严重的可靠性要求,那么我认为您可能需要准备支付一些DB开销

    也许您可以将持久性问题与内存中的问题分开。使用pup sub方法。一个订阅服务器在内存中进行管理,另一个保存数据以备后续启动


    如果您可以购买而不是构建分布式cahcing产品,例如(无Java EE依赖项),则可能与之相关。

    请看一看。

    如果在崩溃时丢失几个条目,情况会有多糟

    如果没有那么糟糕,以下方法可能适合您:

    为每个条目创建平面文件,文件名等于id。一个文件可能用于不太多的连续条目

    确保控制器具有良好的缓存和/或使用Java实现的现有缓存之一

    与文件系统专家讨论如何快速实现这一点

    它很简单,而且可能很快。
    当然,您会丢失包括ACID原则在内的事务。

    如果所有数据都放在内存中,MySQL可以在内存中运行,而不是从磁盘(MySQL群集,混合存储)。然后,它可以为您处理将自身存储到磁盘的问题。

    如果您正在寻找一个简单的键值存储,并且不需要复杂的sql查询,可能值得一看


    另一种选择是,一个现代的DBM实现。

    一个可行吗?还可以查看其他企业数据结构,如和。

    类似的情况如何?

    亚毫秒r/w意味着您不能依赖磁盘,您必须小心网络延迟。忘了标准的基于SQL的解决方案吧,不管是不是主存。在ms中,通过GBit网络获得的数据不能超过100 KB。问一位电信工程师,他们已经习惯于解决这类问题。

    有很多不同的工具和方法,但我认为没有一种能够满足所有的需求

    对于低延迟,您只能依靠内存中的数据访问—磁盘的物理速度太慢(SSD也太慢)。如果数据不能放入一台机器的内存中,我们必须将数据分发到更多的节点,以获得足够的内存

    对于持久性,我们毕竟必须将数据写入磁盘。假设最优组织 这可以作为后台活动完成,不影响延迟。 但是,为了可靠性(故障切换、HA或其他),磁盘操作不能完全独立于访问方法:修改数据时,我们必须等待磁盘,以使舒尔的操作不会消失并发性还增加了一些复杂性和延迟

    数据模型在这里不受限制:大多数方法支持基于唯一密钥的访问

    我们必须做出决定

    • 如果数据放在一台机器的内存中,或者我们必须找到分布式解决方案
    • 如果并发是个问题,或者没有并行操作
    • 如果可靠性是严格的,我们不能放松修改,或者我们可以接受这样一个事实,即意外崩溃将导致数据丢失
    解决方案可能是

    • 自我实现的数据结构使用标准java库、文件等可能不是最佳解决方案,因为可靠性和低延迟需要巧妙的实现和大量的测试
    • 传统的RDBMS具有灵活的数据模型、持久的、原子的和隔离的操作、缓存等—它们实际上知道的太多了,而且大多难以分发。这就是为什么它们太慢的原因,如果你不能关闭不需要的功能,通常就是这样
    • NoSQL键值存储是不错的选择。这些术语相当模糊,涵盖了很多工具。例如
      • BerkeleyDB或Kyoto Cabinet作为一台机器的持久键值存储(使用B树):如果数据