Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Persistentes In-Memory-Python-Objekt für nginx/uwsgi-Server

Was Sie vorschlagen, ist nicht direkt machbar. Da neue Prozesse außerhalb Ihrer Kontrolle hoch- und heruntergefahren werden können, gibt es keine Möglichkeit, native Python-Daten im Speicher zu behalten.

Es gibt jedoch einige Möglichkeiten, dies zu umgehen.

Oft reicht eine Schlüsselwertspeicherebene aus. Und manchmal Puffer mit fester Größe für Werte (die Sie direkt als str verwenden können /bytes /bytearray Gegenstände; alles andere müssen Sie struct drin oder anderweitig serialisieren) ist alles, was Sie brauchen. In diesem Fall kümmert sich das integrierte Caching-Framework von uWSGI um alles, was Sie brauchen.

Wenn Sie eine genauere Kontrolle benötigen, können Sie sich ansehen, wie der Cache über SharedArea implementiert wird und etwas anpassen. Allerdings würde ich das nicht empfehlen. Es gibt Ihnen im Grunde die gleiche Art von API, die Sie mit einer Datei erhalten, und die einzigen wirklichen Vorteile gegenüber der Verwendung einer Datei sind, dass der Server die Lebensdauer der Datei verwaltet. es funktioniert in allen uWSGI-unterstützten Sprachen, sogar in denen, die keine Dateien zulassen; und es macht es einfacher, Ihren benutzerdefinierten Cache zu einem verteilten Cache (für mehrere Computer) zu migrieren, wenn Sie dies später benötigen. Ich glaube nicht, dass diese für Sie relevant sind.

Eine andere Möglichkeit, einen flachen Schlüsselwertspeicher zu erhalten, aber ohne die Puffer mit fester Größe, ist mit Pythons stdlib anydbm . Die Schlüsselwertsuche ist so pythonisch wie es nur geht:Sie sieht genauso aus wie ein dict , außer dass es in einer BDB-Datenbank (oder einer ähnlichen) auf dem Datenträger gesichert und gegebenenfalls im Arbeitsspeicher zwischengespeichert wird, anstatt in einer In-Memory-Hash-Tabelle gespeichert zu werden.

Wenn Sie mit ein paar anderen einfachen Typen umgehen müssen – alles, was blitzschnell zu entpacken ist, wie int s – vielleicht möchten Sie shelve in Betracht ziehen .

Wenn Ihre Struktur starr genug ist, können Sie die Schlüsselwertdatenbank für die oberste Ebene verwenden, aber auf die Werte über eine ctypes.Structure zugreifen , oder mit struct deserialisieren . Aber normalerweise, wenn Sie das tun können, können Sie auch die oberste Ebene eliminieren, woraufhin Ihr ganzes Ding nur noch eine große Structure ist oder Array .

An diesem Punkt können Sie einfach eine einfache Datei zum Speichern verwenden – entweder mmap es (für ctypes ) oder einfach open und read es (für struct ).

Oder verwenden Sie multiprocessing 's Shared ctypes Objekte für den Zugriff auf Ihre Structure direkt aus einem gemeinsam genutzten Speicherbereich.

Wenn Sie nicht ständig alle Cache-Daten benötigen, sondern ab und zu nur kleine Teile, sind Datenbanken genau dafür da. Wieder anydbm usw. sind vielleicht alles, was Sie brauchen, aber wenn Sie eine komplexe Struktur haben, erstellen Sie ein ER-Diagramm, wandeln Sie es in eine Reihe von Tabellen um und verwenden Sie so etwas wie MySQL.