2009-08-29 16 views
5

Tuve la siguiente idea: Digamos que tenemos una aplicación web escrita usando django que modela algún tipo de tablero de anuncios. Esta placa tiene muchos hilos, pero algunos de ellos obtienen la mayor cantidad de publicaciones/vistas por hora. Las páginas de subprocesos se ven un poco diferentes para cada usuario, por lo que no puede almacenar en caché la página representada como un todo y el almacenamiento en caché solo de algunas partes de la página representada tampoco es una opción.Almacén de objetos para objetos en Django entre las solicitudes

Mi idea era: creo una estructura de objeto de la secuencia en la memoria (con cada publicación y otros datos que se necesitan para mostrarla). Si se publica un nuevo mensaje, la estructura se actualiza y cada X publicaciones (o cada Y minutos, lo que suceda primero) los mensajes nuevos se escriben nuevamente en la base de datos. Si la aplicación se cuelga, algunas publicaciones se pierden, pero esto definitivamente está bien (para usuarios y administradores).

La pregunta: ¿Puedo crear un persistente en el almacenamiento de memoria sin serialización (entonces no serialize-> memcached)? Según entiendo, las aplicaciones WSGI (como Django) se ejecutan en un proceso continuo sin cerrar entre las solicitudes, por lo que debería ser posible en teoría. ¿Hay alguna API que pueda usar? Si no, ¿hay algún punto para mirar?

/edit1: Sé que "persistente" generalmente tiene un significado diferente, pero en este caso me refiero estrictamente a "entre una solicitud".

+4

¿Qué pasa con la serialización? ¿Ha perfilado su aplicación? ¿La E/S de la base de datos es el cuello de botella? –

Respuesta

5

En un entorno WSGI de producción, es probable que tenga varios procesos de trabajo atendiendo solicitudes al mismo tiempo. Estos procesos de trabajo se reciclarían de vez en cuando, lo que significa que se perderían los objetos de memoria local.

Pero si realmente necesita esto (y asegúrese de hacerlo), le sugiero que busque en Django's caching framework, eche un vistazo a la memoria caché de la memoria local. Además, eche un vistazo a sessions.

Pero incluso el almacenamiento en caché de la memoria local utiliza la serialización (con pickle). Es fácil implementar el caché de memoria local sin serialización mediante la implementación de un back-end de caché personalizado (consulte the docs). Puede usar el código en locmem.py como punto de partida para crear un caché sin serialización.

¿Pero sospecho que estás haciendo un poco de optimización prematura aquí?

+0

He leído que poner objetos grandes en sesión es una mala idea, ¿hay algún tipo de límite de tamaño suave en el que se debe evitar la sesión y usar el caché? ¿Cómo asociaría la sesión con un objeto particular almacenado en la memoria caché? Si tenía una asociación y la sesión terminó prematuramente, ¿cómo borraría el objeto asociado de la memoria caché? – bischoffingston

0

Un almacenamiento en memoria no es persistente, entonces no.

Creo que quiere decir que solo quiere escribir en la base de datos alguna vez X nuevas publicaciones de objetos. Supongo que esto es por razones de aceleración. Pero como de todos modos necesitas serializarlos tarde o temprano, en realidad no ahorras ningún tiempo de esa manera. Sin embargo, ahorrará tiempo al no descargar los nuevos objetos al disco, pero la mayoría de las bases de datos ya lo admiten.

Pero también habla de almacenar en caché la página representada, que se lee en caché. Allí no puede almacenar en caché el resultado final que dice, pero puede almacenar en caché el resultado de la consulta de la base de datos. Eso significa que el nuevo mensaje no se actualizará de inmediato, pero puede tardar un minuto para aparecer, pero creo que la mayoría de la gente lo verá como aceptable.

Actualización: En este caso, no, entonces. Sin embargo, todavía debería poder almacenar en la memoria caché los resultados de la consulta, pero invalidar esa caché cuando se agreguen nuevas respuestas. Eso debería ayudar.

+0

Pensé que sería claro que quise decir "entre las solicitudes" con "persistente". De hecho, el último punto es la razón por la que pensé sobre esto en el almacenamiento de memoria.Las publicaciones nuevas deben aparecer inmediatamente, por lo que no puedo confiar en ninguna memoria caché de lectura, pero necesito presentarla en (casi) cada solicitud. Claro, habrá algunas solicitudes que podrían hacerse con una página en caché, pero la mayoría no lo harán. –

+0

Bueno, si escribir en el disco es el cuello de botella entonces estás en una mierda profunda aquí. ;) Pero para leer, debe poder tener Memcache que invalida cuando se escriben nuevas respuestas. –

Cuestiones relacionadas