Ottimizzazione di uno schema di impaginazione ibrido

4

Sto lavorando su un'applicazione Web usando node.js in cui sto costruendo una copia parziale del database sul lato client per ridurre il carico sul mio server. In questo momento, ho una funzione come questa (espressa come pseudocodice in stile python, ma implementata in JavaScript):

get(table_name,primary_key):
    if primary_key in cache[table_name]:
        return cache[table_name][primary_key]
    else:
        x = get_data_from_server(table_name,primary_key) # socket.io
        return cache[table_name][primary_key] = x

Sebbene questo schema funzioni perfettamente per la memorizzazione nella cache di singole righe, vorrei estenderlo per supportare la creazione di tabelle impaginate ordinate secondo il tasto primary_key e caricare dati aggiuntivi usando la funzione sopra per solo la corrente e possibilmente l'adiacente pagine. Ora, non voglio mantenere l'elenco delle chiavi primarie sul server per essere recuperato ogni volta che ho bisogno di cambiare la pagina (che, per ragioni che vanno oltre lo scopo qui, sarà molto frequente), e tenerlo sul client lato, soggetto a creare / eliminare eventi in tempo reale dal server, non sembra un'idea valida, anche dopo la compressione (utilizzando intervalli, anziché singoli valori).

Qual è il modo migliore per calcolare quali elementi devono essere visualizzati su una pagina a caso, riducendo al minimo i requisiti di spazio e amp; la necessità di comunicazione con il server?

    
posta Kaustubh Karkare 10.10.2012 - 18:08
fonte

2 risposte

1

Tieni presente che il nodo non blocca durante l'attesa di io, non se stai elaborando elementi all'interno del tuo codice. Se utilizzi il nodo per eseguire il loop o manipolare i set di dati di grandi dimensioni, valuta la possibilità di scaricare tale lavoro nel database o in altri processi.

Sembra anche che tu stia cercando di combinare la logica del database (chiavi primarie, righe) con la logica dell'applicazione (viste utente, modelli) in una singola funzione di memorizzazione nella cache. Considerare un duplice approccio di ottimizzazione a livello di database e livello applicazione:

A livello di database, esaminare l'utilizzo del database, utilizzare EXPLAIN, esaminare l'uso degli indici, rimuovere N + 1 e altre chiamate al database ripetute.

A livello di applicazione, pensa alle tue pagine (specialmente sul carico iniziale) come a intere viste anziché a tabelle e righe. quindi memorizzare nella cache tutti i dati necessari per le viste più comuni, se gli stessi dati vengono presentati a tutti gli utenti, prendere in considerazione la memorizzazione nella cache dell'intero output sottoposto a rendering. Se si utilizzano le chiamate ajax, considerare l'archiviazione del set iniziale di dati memorizzati nella cache come json incorporato nella risposta html. Guarda anche dove è memorizzata la tua cache, redis e memcached sono datastore popolari per i dati dei siti live.

Ref: - NodeJS Event Loop: link - Architettura MVVM: link - Caching della pagina Nodejs: link

    
risposta data 10.08.2013 - 18:06
fonte
0

Se il server esegue l'impaginazione, non restituisce già un piccolo sottoinsieme?

Potresti lasciare che il server restituisca solo un elenco di chiavi primarie per la pagina richiesta. Materializza quanti più soldi possibile dalla tua cache, poi recupera in blocco le identità rimanenti dal server in una sola chiamata.

    
risposta data 12.12.2012 - 20:42
fonte

Leggi altre domande sui tag