Tutti incontriamo situazioni in cui dobbiamo aspettare un'eternità per ottenere una risposta dal database in cambio delle query generate sul server delle applicazioni. Per le applicazioni business-critical, la latenza e il ritardo nella risposta sono intollerabili. È qui che nasce la necessità di una soluzione di memorizzazione nella cache ottimizzata.
Sebbene le cache siano comunemente associate agli archivi di valori-chiave, NCache fa un ulteriore passo avanti consentendoti di interrogare i dati sugli attributi non chiave dei tuoi oggetti. Ciò significa che puoi accedere ai dati in base a un'ampia gamma di proprietà oltre alle sole chiavi. Questo approccio offre maggiore flessibilità ed efficienza per il recupero dei dati, semplificando l'analisi e la gestione dei dati.
Con il passare del tempo, i dati nella cache aumentano, pertanto sono necessarie tali funzionalità nelle cache, in cui è possibile generare query per prestazioni di ricerca e recupero più rapide. NCache ti consente di interrogare i tuoi dati in modo efficiente durante la ricerca.
Come NCache ottimizza le prestazioni di ricerca e recupero?
NCache ottimizza le sue prestazioni di ricerca e recupero attraverso l'indicizzazione, le proiezioni, la dimensione del blocco e la cache del client. Mettendo nella cache i risultati delle query in memoria, la reattività delle richieste è notevolmente migliorata. Poiché molte query vengono servite direttamente dalla cache, vengono salvati ulteriori viaggi del database. NCache utilizza diversi modi per migliorare le prestazioni di ricerca e recupero, come discusso di seguito.
1. Crea strategicamente indici
Per una ricerca efficiente dei dati basata su query, NCache richiede la creazione di indici di ricerca. A differenza dei database tradizionali, che possono essere lenti senza indici ed eseguire ricerche complete nell'archivio per trovare i dati, NCache dà la priorità alle prestazioni, rendendo obbligatoria la creazione di indici. Creando indici, NCache può determinare il tipo di dati e il formato di archiviazione più adatti alle tue esigenze di ricerca, garantendo che le ricerche siano rapide ed efficienti
Però, i NCache usa indicizzazione poiché si tratta di un approccio orientato alle prestazioni, ma l'indicizzazione degli attributi per una ricerca deve essere eseguita con molta attenzione poiché richiede spazio per conservare un indice e l'indicizzazione di attributi non necessari può comportare un sovraccarico di memoria e prestazioni.
NCache fornisce due modi per definire gli indici.
• Indice predefinito (Indice statico)
• Indice di esecuzione (Indice dinamico)
2. Usa le proiezioni in modo intelligente
Quando si tratta di domande, proiezioni può migliorare significativamente le prestazioni della tua applicazione. In base alla tua domanda, NCache consente di recuperare tutte le caratteristiche indicizzate di una classe o proiezioni particolari dal cache-store.
utilizzando NCache, puoi specificare le colonne di tua scelta da proiettare sulla tua query per eseguire la ricerca in modo più efficiente. Oltre a proiezioni di colonne specifiche, è anche possibile recuperare più proiezioni. Di seguito è riportato un esempio che progetti $GROUP$
ed $Value$
in un'unica interrogazione.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
string query = "SELECT $Value$, $Group$ FROM FQN.Product WHERE Productid > ?"; // Providing parameters for query queryCommand.Parameters.Add("ProductID",50000); // Check if the result set is not empty if (reader.FieldCount > 0) { while (reader. Read()) { Product value = reader.GetValue(1); string group Name = reader.GetValue(2); // Perform operations } } else { // Null query result set retrieved } |
Per impostazione predefinita, se non specifichi le proiezioni, l'oggetto completo insieme alle caratteristiche indicizzate viaggia dal server al client su richiesta: sarà più lento dei dati selettivi. Di seguito è riportato un esempio che recupera tutti i campi relativi alla classe Product dalla cache tramite il *
operatore.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
string query = "SELECT * FROM FQN.Product WHERE ProductID > ?"; // Providing parameters for query queryCommand.Parameters.Add("ProductID",50000); // Check if the result set is not empty if (reader.FieldCount > 0) { while (reader.Read()) { string result = reader.GetValue("ProductID"); // Perform operations } } else { // Null query result set retrieved } |
È importante notare che utilizzando le proiezioni, NCache riduce il lavoro extra di recupero di tutte le caratteristiche indicizzate dell'oggetto e recupera solo le colonne desiderate. NCache aiuta gli utenti a migliorare le prestazioni in questo modo facilitando una migliore sintassi delle query.
3. Dimensione del blocco / Recupera i dati in blocchi
NCache fornisce un'altra funzionalità per l'ottimizzazione delle query chiamata Chunk Size. Dopo aver eseguito una query di ricerca, l'applicazione riceve i pacchetti dati/chiave in blocchi, dove ogni blocco rappresenta una dimensione specifica di pacchetti dati/chiave. Esistono diversi modi per eseguire query sui dati, sia che si desideri eseguire query solo sulle chiavi o su elementi selettivi o su un set completo di proprietà di un oggetto, chiamato set di dati.
Più grande è il set di risultati, più lento sarà il recupero in risposta alla query generata. Quindi, il client che sta consumando i dati invece di recuperare l'intero set di risultati in una volta consuma i dati in blocchi dal server uno per uno. NCache per impostazione predefinita, porta i dati in blocchi più piccoli dal server al lato client, unisce i blocchi di dati e fornisce i dati all'applicazione.
Il valore predefinito di una dimensione del blocco è 512 KB, ma gli utenti possono configurarlo dimensione del pezzo in base alle loro esigenze, mentre esegue il lettore per eseguire una ricerca sulla cache in base alla query specificata. Poiché i dati viaggiano sotto forma di blocchi sulla rete, ciò migliora le prestazioni di ricerca e recupero dei dati.
4. Utilizzo della cache del client
NCache ha una funzione versatile chiamata Client Cache (L1 Cache). L1 è un sottoinsieme della cache principale che risiede più vicino all'applicazione che può essere InProc e, OutProc. Poiché si tratta di un sottoinsieme della cache principale (cache L2), le query non vengono eseguite utilizzando la cache L1. Solo operazioni basate su chiavi, come add
, get
, o getbulk
le operazioni vengono eseguite cercando prima le chiavi nella cache L1 e recuperando le chiavi mancanti dalla cache L2, unendo e servendo.
La cache L2 contiene dati completi, quindi le query e le operazioni eseguite dai tag vengono sempre eseguite su di essa. Anziché eseguire una query per recuperare tutti i dati dalla cache L2, l'utente può ottenere le chiavi solo dalla cache L2. E poi usa bulk get per recuperare quelle chiavi dalla cache L1. Se mancano dei dati, verranno serviti dalla cache L2. Le operazioni di lettura/scrittura eseguite di frequente vengono archiviate nella cache del client, con tempi di recupero più rapidi per le successive richieste degli stessi dati.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Executing query to fetch keys only ICacheReader reader = _cache.SearchService.ExecuteReader(queryCommand, false); // Check if the result set is not empty if (reader.FieldCount > 0) { while (reader.Read()) { //Populate Keys List keys.Add(reader.GetValue(0)); } } //Get Data using Bulk API. IDictionary<string, Product> productsList = _cache.GetBulk(keys); //If the number of keys is very large, you can break the list into multiple chunks and then do GetBulk for each chunk separately. |
NCache fornisce un'applicazione di esempio per recuperare i dati in modo efficiente da Client Cache in poi GitHub.
Conclusione
In questo blog, abbiamo coperto i molteplici modi in cui NCache utilizza per migliorare le prestazioni di ricerca di query e recupero dati. NCache non solo migliora le prestazioni delle applicazioni, ma garantisce anche un'elevata disponibilità e scalabilità per soddisfare il carico degli utenti. Quindi, senza ulteriori attese Scaricare NCache ora e inizia la tua prova gratuita di 60 giorni!