我读到一些数据库可以在内存中使用,但想不出为什么有人会想要使用这个特性。我总是使用数据库来持久化数据和内存缓存以实现快速访问。
11 回答
缓存也是一种数据库,就像文件系统一样。“内存缓存”只是内存数据库的特定应用,一些内存数据库专门用作内存缓存。
内存数据库的其他用途已经包含在其他答案中,但让我也列举一下用途:
- 内存缓存。通常会使用专门用于该用途的数据库系统(可能称为“内存缓存”而不是“数据库”)。
- 测试与数据库相关的代码。在这种情况下,通常会使用一些通用数据库系统的“内存”模式,但也可以使用专用的“内存”数据库来替换其他“磁盘”数据库以加快测试速度。
- 复杂的数据操作。内存中的 SQL 数据库通常以这种方式使用。SQL 是一个很好的数据操作工具,有时在计算最终结果时不需要将数据写入磁盘。
- 存储瞬态运行时状态。有些应用程序需要将其状态存储在某种数据库中,但不需要在应用程序重新启动时将其持久化。想想某种流程管理器——它需要跟踪运行的子流程,但这些数据只有在应用程序和子流程运行时才有效。
一个常见的用例是运行单元/集成测试。
您并不真正关心每次测试运行之间的持久数据,并且您希望测试尽可能快地运行(以鼓励人们经常这样做)。在进程中托管数据库使您可以非常快速地访问数据。
您的内存缓存是否支持 SQL?
你认为内存数据库是一个非常聪明的缓存怎么样?
这确实留下了如何填充内存数据库以及如何管理更新以及如何跨多个实例保持一致性的问题。
如果您不使用诸如索引之类的技巧,那么在 100000 个元素中搜索某些东西会很慢。这些技巧已经在数据库引擎中实现(无论是持久的还是内存中的)。
内存数据库可能会提供比您可以通过自写结构快速实现的搜索功能更有效的搜索功能。
对于通用(读取端)查询,内存数据库大约比传统 RDBMS 快一个数量级。大多数都是磁盘支持的,提供与普通 RDBMS 完全相同的一致性 - 只捕获必须适合 RAM 的整个数据集。
核心思想是磁盘支持的存储具有巨大的随机访问损失,这不适用于 DRAM。可以使用传统 RDBMS 数据缓存方案不可行的随机访问优化方式对数据进行索引/组织。
需要实时响应的应用程序希望使用内存数据库,可能是控制飞机、响应时间至关重要的工厂的应用程序
内存数据库在游戏编程中也很有用。您可以将数据存储在比永久数据库快得多的内存数据库中。
它们用作存储、查询和修改运行时数据的高级数据结构。
如果多个不同的应用程序要访问数据集,您可能需要一个数据库。数据库具有用于访问/修改数据的一致接口,而您的哈希表(或您使用的任何其他数据)将没有这些接口。
如果单个程序正在处理数据,那么使用您使用的任何语言的数据结构都是合理的。
内存数据库比执行数据库缓存更好。当涉及到 READ 操作时,数据库缓存的工作方式类似于内存数据库。
另一方面,当涉及到 WRITE 操作时,与数据库缓存相比,内存数据库更快,后者将数据持久化到磁盘上(这会导致 IO 开销)。
此外,使用数据库缓存,您可以以缓存未命中结束,但在使用内存数据库时,您永远不会以缓存未命中结束。
鉴于它们的速度和 RAM 价格的下降,内存数据库很可能成为未来的主导技术。已经有一些开发了复杂的功能,例如 SQL 查询、二级索引和用于处理大于 RAM 的数据集的引擎。