C或C ++ - 动态增长/缩小磁盘支持的共享内存

时间:2009-12-26 00:41:11

标签: c++ c shared-memory mmap

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

数据绑定到会话(唯一的会话ID字符串),并且应该能够在服务器重新启动后继续存在。根据会话数量,共享数据可能太大而无法容纳到主内存中。理想情况下,在共享数据超过某个阈值的情况下,绑定到最不活跃的会话的数据应仅存在于磁盘上,而最活跃的会话数据应该可从主存储器获得。会话暂停一段时间后,会话数据将被销毁。

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

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

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

2 个答案:

答案 0 :(得分:3)

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

解决方案的“重量”是一件有趣的事情。如果您使用数据库,您的代码可能会少得多,而海豚和蓝鲸之间会有一些游戏。如果您从头开始构建持久性机制,那么您将拥有大量代码。

看看bdb作为中间选择。

答案 1 :(得分:3)

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

  • 统计缓存
  • 数据持久性
  • 流程之间的数据共享

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

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

有许多更高级的解决方案,但这些解决方案适用于现实世界的问题 - 即,您必须构建群集。

相关问题