2013-01-09 16 views
5

Sto costruendo una pagina progettata per essere "visualizzata" molto, ma molti meno utenti "scriveranno" nel database. Ad esempio, solo 1 su 100 utenti possono pubblicare le sue notizie sul mio sito, e il resto leggerà solo le notizie.Memorizzazione nella cache dei risultati della query in MongoDB

Nel caso precedente, 100 SAME QUERY saranno eseguite quando visitano la mia homepage mentre il cambio effettivo del database è basso. In realtà 99 di queste query sono uno spreco di potenza del computer. Esistono metodi che possono memorizzare nella cache i risultati della prima query e quando rilevano la stessa query in un breve periodo di tempo possono fornire il risultato memorizzato nella cache?

Io uso MongoDB e Tornado. Tuttavia, alcuni post dicono che MongoDB non fa cache.

Creare un codice HTML statico memorizzato nella cache con qualcosa di simile a Nginx non è preferibile, perché voglio rendere ogni volta una pagina personalizzata da Tornado.

risposta

3

L'autore del pacchetto motore (Mongo + Tornado) dà un esempio di caching sua lista di categorie qui: http://emptysquare.net/blog/refactoring-tornado-code-with-gen-engine/

In sostanza, si definisce un elenco globale di categorie e interroga il database per riempirlo in; poi, ogni volta che ha bisogno delle categorie nelle sue pagine, controlla l'elenco: se esiste, lo usa, se non lo fa, interroga nuovamente e lo riempie. Lo ha impostato per invalidare l'elenco ogni volta che inserisce nel database ma, a seconda dell'utilizzo, è possibile creare una variabile di timeout globale per tenere traccia di quando è necessario eseguire nuovamente la query in seguito. Se stai facendo qualcosa di complicato, questo potrebbe sfuggire di mano, ma se è solo una lista dei post più recenti o qualcosa del genere, penso che andrebbe bene.

6

Io uso MongoDB e Tornado. Tuttavia, alcuni post dicono che MongoDB non fa cache.

Non so chi ha detto questo, ma MongoDB ha un modo per memorizzare nella cache le query, infatti utilizza il sistema operativo LRU' mettere in cache dal momento che non fa la gestione della memoria stessa.

Fintanto che il set di lavoro si inserisce nell'LRU senza che il sistema operativo lo debba sfogliare o scambiare costantemente, si consiglia di leggere questa query dalla memoria nella maggior parte dei casi. Quindi, sì, MongoDB può memorizzare nella cache, ma tecnicamente no; il sistema operativo fa.

Attualmente 99 di queste query sono uno spreco di alimentazione del computer.

I meccanismi di caching per risolvere questo tipo di problemi sono gli stessi nella maggior parte dei tecnici, sia di MongoDB che di SQL. Certo, questo è importante solo se si tratta di un problema, probabilmente stai microterminando se me lo chiedi; a meno che tu non abbia traffico Facebook o Google o Youtube.

Il caching soggetto va su un argomento enorme che va da query nella cache sia in pre-aggregate MongoDB/Memcache/Redis ecc per il caching HTML e altre risorse di Internet per fare meno lavoro possibile sul lato server.

Il tuo scenario, personalmente come ho detto, sembra che tu stia pensando male alla potenza del computer sprecato. Anche se dovessi memorizzare questa query in un'altra raccolta/tecnologia, probabilmente useresti la stessa quantità di energia e risorse recuperando il risultato di quella tecnologia piuttosto che se non ti preoccupassi. Tuttavia questa ipotesi si riduce a voi avere il diritto indici, schemi, set-up ecc

vi consiglio di leggere alcuni link su una buona progettazione dello schema e la creazione dell'indice:

Creare un codice HTML statico memorizzato nella cache con qualcosa di simile a Nginx non è preferito, perché voglio rendere ogni volta una pagina personalizzata da Tornado.

Yea penso cercando di preoccuparsi di caching delle query si sono pre-maturo ottimizzando, soprattutto se non si vuole decollare, quello che sarebbe stato il 90% del carico sul server ogni volta; caricando la pagina stessa.

Mi concentrerei sugli schemi e sugli indici e quindi mi preoccupo del caching se ne hai davvero bisogno.

+0

Grazie per la risposta! Comunque penserei che la risposta di Josh mi si addica di più. Ma vorrei ancora esaminare il problema dell'indicizzazione. Grazie :) –

+0

@MKYung Hmm un modulo che prende una nuova query in memoria, crea un nuovo elenco usando i risultati (causando IO) e quindi fa una query su quell'elenco risultando in due raccolte che contengono praticamente gli stessi dati in memoria allo stesso tempo finché l'LRU non ha bisogno di estrarre la memoria ... Non vedo il punto completo di quel modulo ma ok :) – Sammaye

+1

Non sappiamo dalla domanda dell'OP quanto tempo ci vuole per generare ogni pagina in modo che non è possibile dire dalle informazioni fornite se si sta ottimizzando prematuramente o micro-ottimizzando. – frankster

Problemi correlati