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