内存数据库(如redis)如何与其他应用程序通信?

How do in-memory databases (such as redis) communicate with other applications?

我正在实施一个本地计算机数据库,它允许我在 C 和 fortran 程序(C 用于控制流,fortran 用于矩阵计算)之间传输信息和数据。

我了解内存数据库的概念,但程序如何从中获取数据?我是否需要打开本地端口并定期连接到它?是否有另一个较低级别的系统调用或允许我直接与程序通信的东西?

在我的脑海中,我在制作一个运行数据库内部的大型 C 程序以及 fortran 矩阵计算(不直接在数据库上)和将其存储到二进制文件之间来回切换并在程序之间重新打开它。

我也明白使用别人的软件会更容易和更快,但我想自己做,以增加我的理解和编程能力。

我不会说redis,但我可以告诉你我公司的实现:eXtremeDB。

eXtremeDB 主要是用 C 编写的(C++ 用于 SQL,一些程序集,例如自旋锁)。我们为可以互换使用的多种语言提供原生和 SQL APIs。

对于您描述的混合语言场景,数据库将在共享(命名)内存中创建,该内存映射到每个进程的地址 space。因此,它是一个 'embedded' 数据库。数据库 运行time 本身是与应用程序链接的共享库。因此,这符合您的描述“运行 内部数据库的大型 C 程序”。您可以根据需要用 'fortran' 替换 'C'。

因此,进程可以通过已发布的接口直接、非常快速地访问存储的数据(即,与 client/server 架构相比,没有进程间通信开销)。数据库 运行time 控制并发访问。 “访问”可以通过 SQL (SELECT * FROM table WHERE...) 或通过本机 API。当然,原生 API 更快。对于自己动手的方法,更多的是 tractable(实现 SQL 引擎是一件大事)。

您可能想要实现一个 'load' 和 'store' 接口以在 运行 之间保存和重新加载内存数据库。这很简单;内存数据库将存在于一块连续的内存中(例如,使用 OS 的共享内存操作分配 5MB 的共享内存并将其映射到本地地址 space),它可以只流出到持久性媒体。这意味着您将在数据库中创建一个子分配器 运行-time 来分配较小的块来存储对象。如果共享内存数据库中的对象之间存在关系,请确保将它们存储为偏移量而不是直接指针引用,因为无法保证数据库将映射到后续 运行 上的相同起始内存地址。