Devo mettere in cache i dati o colpire il database?

9

Non ho lavorato con nessun meccanismo di memorizzazione nella cache e mi chiedevo quali fossero le mie opzioni nel mondo .net per il seguente scenario.

Fondamentalmente abbiamo un servizio REST in cui l'utente passa un ID di una categoria (cartella think) e questa categoria può avere molte sottocategorie e ciascuna delle sottocategorie potrebbe avere 1000 di contenitori multimediali (think file reference objects) che contiene informazioni su un file che potrebbe trovarsi su un server NAS o SAN (i file sono video in questo caso). La relazione tra queste categorie è memorizzata in un database insieme ad alcune regole di autorizzazione e metadati relativi alle sottocategorie.

Quindi dal punto di vista dell'interfaccia utente abbiamo un controllo dell'albero carico pigro che viene guidato dall'utente facendo clic su ciascuna sottocartella (si pensi a Windows Explorer). Una volta arrivati a un URL del file video, possono quindi guardare il video.

Il numero di utenti potrebbe crescere fino a 1000 e le sottocategorie e i video potrebbero essere nei 10000 con la crescita del sistema.

La domanda è: dovremmo continuare a lavorare nel modo in cui ogni richiesta colpisce il database o dovremmo pensare a mettere in cache i dati?

Stiamo utilizzando IIS 6/7 e Asp.net.

    
posta JD01 24.06.2012 - 10:47
fonte

2 risposte

12

Innanzitutto, assicurati che il codice sia partizionato in modo tale che il tuo fornitore di dati possa essere cambiato facilmente. Stiamo parlando della segregazione delle interfacce e degli altri principi SOLID qui.

Successivamente devi conoscere la risposta a quanto segue:

1) I dati cambieranno frequentemente? 2) L'applicazione esegue il polling del servizio REST frequentemente per ottenere questi aggiornamenti? 3) Il database è utilizzato per altri scopi? 4) Sei a conoscenza di eventuali problemi di prestazioni attuali? 5) I dati sono aggiornati dalla tua applicazione e questi aggiornamenti devono essere riflessi nell'app?

La cosa interessante è che usando il database, stai tecnicamente caching i dati già. Questo è ciò che fa un database. Un sacco di R & D va nel rendere il database il più veloce possibile al recupero dei dati. Ad esempio, utilizza la propria cache di memoria per i dati utilizzati di frequente.

Quindi chiediti cosa speri di guadagnare scambiando i provider di cache? E quali sono le attuali limitazioni che devono essere affrontate?

Se al momento non si verificano rallentamenti, direi semplicemente "no, non è necessario cambiare".

È un argomento davvero grande. Le cache tendono a fare davvero bene quando i dati devono essere distribuiti geograficamente, ma c'è un enorme sovraccarico in termini di gestione.

Sto facendo un progetto nel momento in cui sto facendo esattamente lo stesso tipo di decisioni.

La mia soluzione finora è di usare solo il database e colpirlo con le richieste di polling di ogni client. Sembra schifo, ma scala (in fase di test) molto più di quanto avrò bisogno, il codice è molto semplice.

Detto questo, il mio codice utilizza una sorta di modello di repository che astrae il provider di dati dell'applicazione principale dal codice del database. Se volessi scambiare un provider di cache come GemFire, richiederebbe una quantità minima di codice da fare.

    
risposta data 24.06.2012 - 11:16
fonte
17

Non ci sono davvero abbastanza informazioni, come da commenti di Thorbjørn.

Il caching, se fatto male, può causare a te & i tuoi utenti sono un sacco di dolore. Assicurati di aver bisogno di preoccuparti del caching prima di complicare eccessivamente la tua applicazione.

Quindi, in assenza di informazioni che indicano che è davvero necessario memorizzare nella cache, non memorizzare nella cache.

[Regola generale di ottimizzazione: se hai bisogno di chiedere se dovrei fare qualcosa, la risposta è no] *
* Sarebbe una dichiarazione, non una domanda, nella maggior parte dei casi in cui la risposta è sì.

    
risposta data 24.06.2012 - 11:16
fonte

Leggi altre domande sui tag