sql >> データベース >  >> NoSQL >> Redis

nginx/uwsgiサーバー用の永続的なメモリ内Pythonオブジェクト

    あなたが提案していることは直接実行可能ではありません。新しいプロセスは制御外でスピンアップおよびスピンダウンできるため、ネイティブPythonデータをメモリに保持する方法はありません。

    ただし、これを回避する方法はいくつかあります。

    多くの場合、必要なのは1レベルのキー値ストレージだけです。また、値用の固定サイズのバッファ(strとして直接使用できる)がある場合もあります。 /bytes / bytearray オブジェクト; structする必要があるその他のもの そこにあるか、そうでなければシリアル化する)が必要なすべてです。その場合、uWSGIの組み込みキャッシュフレームワークが必要なすべてを処理します。

    より正確な制御が必要な場合は、SharedAreaの上にキャッシュがどのように実装されているかを確認できます。 何かをカスタマイズします。しかし、私はそれをお勧めしません。基本的に、ファイルで取得するのと同じ種類のAPIを提供します。ファイルを使用する場合の唯一の本当の利点は、サーバーがファイルの存続期間を管理することです。ファイルを許可しない言語も含め、uWSGIがサポートするすべての言語で機能します。また、後で必要になった場合に、カスタムキャッシュを分散(マルチコンピューター)キャッシュに簡単に移行できます。それらのどれもあなたに関係があるとは思いません。

    フラットなキー値ストレージを取得する別の方法は、固定サイズのバッファーを使用せずに、Pythonのstdlib anydbmを使用することです。 。 Key-Valueルックアップは、可能な限りpythonicです。これは、dictのように見えます。 ただし、ディスク上のBDB(または同様の)データベースにバックアップされ、メモリ内のハッシュテーブルに格納されるのではなく、メモリに適切にキャッシュされます。

    他のいくつかの単純なタイプを処理する必要がある場合-intのように、非常に高速に解凍/ピクルスするもの s-shelveを検討することをお勧めします 。

    構造が十分に堅固な場合は、トップレベルにKey-Valueデータベースを使用できますが、ctypes.Structureを介して値にアクセスします。 、またはstructでデ/シリアル化 。しかし、通常、それができれば、トップレベルを削除することもできます。その時点で、すべてが1つの大きなStructureになります。 またはArray

    その時点で、ストレージにプレーンファイル(mmap)を使用できます。 それ(ctypesの場合 )、または単にopen およびread それ(structの場合 )。

    または、multiprocessingを使用します の共有ctypes Structureにアクセスするためのオブジェクト 共有メモリ領域から直接。

    一方、実際にすべてのキャッシュデータを常に必要としているわけではなく、たまに少しずつ必要な場合は、まさにそれがデータベースの目的です。繰り返しますが、anydbm などで十分かもしれませんが、複雑な構造の場合は、ERダイアグラムを作成し、それを一連のテーブルに変換して、MySQLなどを使用してください。



    1. Mongoアグリゲーションフレームワークを使用した複数のグループ操作

    2. JongoとMongoDBを使用したjackson逆シリアル化でObjectId_idの名前をidに変更します

    3. 最高の挿入/秒のパフォーマンスを備えたDB?

    4. MongoDBをインストールする方法