sql >> Base de Datos >  >> NoSQL >> Redis

Objeto de Python persistente en memoria para el servidor nginx/uwsgi

Lo que estás sugiriendo no es directamente factible. Dado que los nuevos procesos pueden girar hacia arriba y hacia abajo fuera de su control, no hay forma de mantener los datos nativos de Python en la memoria.

Sin embargo, hay algunas formas de evitar esto.

A menudo, todo lo que necesita es un nivel de almacenamiento de clave-valor. Y, a veces, tener búferes de tamaño fijo para valores (que puede usar directamente como str /bytes /bytearray objetos; cualquier otra cosa que necesite struct allí o serializar de otra manera) es todo lo que necesita. En ese caso, el marco de almacenamiento en caché integrado de uWSGI se encargará de todo lo que necesite.

Si necesita un control más preciso, puede ver cómo se implementa el caché sobre SharedArea y hacer algo personalizado. Sin embargo, no recomendaría eso. Básicamente, le brinda el mismo tipo de API que obtiene con un archivo, y las únicas ventajas reales sobre el uso de un archivo son que el servidor administrará la vida útil del archivo; funciona en todos los idiomas compatibles con uWSGI, incluso aquellos que no permiten archivos; y hace que sea más fácil migrar su caché personalizada a una caché distribuida (multicomputadora) si lo necesita más adelante. No creo que ninguno de ellos sea relevante para ti.

Otra forma de obtener un almacenamiento plano de clave-valor, pero sin los búferes de tamaño fijo, es con stdlib anydbm de Python. . La búsqueda de clave-valor es tan pitónica como parece:parece un dict , excepto que está respaldada en una base de datos BDB (o similar) en disco, almacenada en caché según corresponda en la memoria, en lugar de almacenarse en una tabla hash en memoria.

Si necesita manejar algunos otros tipos simples, cualquier cosa que sea increíblemente rápida para deshacer/decapar, como int s:es posible que desee considerar shelve .

Si su estructura es lo suficientemente rígida, puede usar la base de datos de clave-valor para el nivel superior, pero acceda a los valores a través de un ctypes.Structure , o deserializar con struct . Pero por lo general, si puede hacer eso, también puede eliminar el nivel superior, momento en el que todo es solo una gran Structure o Array .

En ese momento, puede usar un archivo simple para el almacenamiento, ya sea mmap it (para ctypes ), o simplemente open y read it (para struct ).

O use multiprocessing ctypes compartidos de Objetos para acceder a su Structure directamente desde un área de memoria compartida.

Mientras tanto, si en realidad no necesita todos los datos de caché todo el tiempo, solo fragmentos de vez en cuando, eso es exactamente para lo que son las bases de datos. De nuevo, anydbm , etc. puede ser todo lo que necesite, pero si tiene una estructura compleja, dibuje un diagrama ER, conviértalo en un conjunto de tablas y use algo como MySQL.