1

我有几个应该共享数据的 fastcgi 进程。

数据绑定到一个会话(一个唯一的会话 id 字符串),并且应该能够在服务器重新启动后继续存在。根据会话的数量,共享数据可能太大而无法放入主内存。理想情况下,当共享数据超过某个阈值时,绑定到最不活跃会话的数据应该只存在于磁盘上,而最活跃的会话数据应该从主内存中可用。在会话处于非活动状态一段时间后,会话数据将被销毁。

我的问题是(作为 C/++ 的新手):

是否有任何方法或库可以帮助我解决这个非常棘手的问题?

mmap()考虑到应该销毁非活动会话数据的要求,是否可以与共享内存一起使用?

4

2 回答 2

3

好吧,大多数人会为此使用 SQL 数据库,并且要么实现缓存,要么依赖数据库来执行最近使用的缓存。非活动破坏将是后台线程的工作。重新启动时,您需要清除旧会话的剩余部分。

解决方案的“重量”是一件有趣的事情。如果您使用数据库,您的代码可能会少很多,并且在后面游来游去的海豚和蓝鲸之间的东西。如果您从头开始构建持久性机制,您将拥有大量代码。

看看 bdb 作为中间选择。

于 2009-12-26T00:56:08.507 回答
3

在您对 bmargulies 发表评论后,我应该提醒您,我自己试图做您所描述的事情,我发现我正在编写一个 ACID 数据库。回顾一下,您要求:

  • 统计缓存
  • 数据持久性
  • 进程间数据共享

这就是数据库系统的作用。使用别人写的要好得多。IMO 你的选择是sqliteberkeley-db。. Sqlite 不用于并行访问,另一方面,berkeley-db非常可扩展,但是它使用字符串 - 字符串字典作为其数据模型。

BDB 可以将数据库完全存储在内存中,也可以将数据库序列化到磁盘并缓存在内存中。您还可以调整 ACID 语义以满足您的特定需求——即,您可以禁用持久写入,这将为您提供即时写入特性,同时牺牲防弹数据的持久性。

有许多更高级的解决方案,但这些都是针对现实世界的问题——即,您必须构建一个集群。

于 2009-12-26T01:11:41.797 回答