1

データを共有することになっているいくつかの fastcgi プロセスがあります。

データはセッション (一意のセッション ID 文字列) にバインドされ、サーバーの再起動後も存続できるはずです。セッションの数によっては、共有データが大きすぎてメイン メモリに収まらない場合があります。理想的には、共有データが特定のしきい値を超えた場合、最もアクティブでないセッションにバインドされたデータはディスクにのみ存在し、最もアクティブなセッション データはメイン メモリから使用できるようにする必要があります。セッションがしばらく非アクティブになった後、セッション データは破棄されます。

私の質問は(C / ++の初心者であること)です:

この非常に厄介な問題に取り組むのに役立つアプローチやライブラリはありますか?

mmap()非アクティブなセッション データを破棄する必要があることを考慮して、共有メモリを使用することは可能ですか?

4

2 に答える 2

3

bmarguliesへのコメントの後、私自身があなたが説明していることをやろうとしたこと、そして私がACIDデータベースを書いていることに気づいたことを警告する必要があります。要約すると、あなたは求めています:

  • 統計的キャッシング
  • データの永続性
  • プロセス間のデータ共有

これがデータベースシステムの役割です。他の人が書いたものを使う方がはるかに良いです。IMOの選択肢はsqliteberkeley-dbです。。Sqliteは並列アクセス用ではありませんが、berkeley-dbは非常にスケーラブルですが、データモデルとして文字列-文字列ディクショナリを使用します。

BDBは、データベースを完全にメモリ内に配置することも、ディスクにシリアル化してメモリにキャッシュする通常の方法で配置することもできます。また、特定のニーズに合わせてACIDセマンティクスを調整することもできます。つまり、耐久性のある書き込みを無効にすることができます。これにより、防弾データの耐久性を犠牲にしながら、即時の書き込み特性が得られます。

より高度なソリューションはたくさんありますが、これらは実際の問題のためのものです。つまり、クラスターを構築する必要があります。

于 2009-12-26T01:11:41.797 に答える
3

まあ、ほとんどの人はこれに SQL データベースを使用し、キャッシュを実装するか、データベースに依存して最近使用したキャッシュを実行します。非アクティブな破棄は、バックグラウンド スレッドの仕事です。再起動時に、古いデッド セッションの残り物を一掃する必要があります。

ソリューションの「重み」は面白いものです。データベースを使用する場合は、おそらくコードが大幅に少なくなり、イルカとシロナガスクジラの間の何かが後ろを泳いでいます。永続化メカニズムをゼロから構築すると、大量のコードが作成されます。

中間の代替手段として bdb を見てください。

于 2009-12-26T00:56:08.507 に答える