NCache è un archivio di valori-chiave. Recupera rapidamente gli elementi memorizzati nella cache tramite la loro chiave. Ma può anche cercare voci memorizzate nella cache in base ad altre proprietà. Ad esempio, invece di cercare i prodotti memorizzati nella cache tramite la loro chiave, possiamo anche cercarli per categoria, fascia di prezzo e peso. Impariamo come indicizzare gli elementi memorizzati nella cache per renderli ricercabili.
Ricerca
Oltre a trovare gli oggetti in base alla loro chiave, con NCache, possiamo interrogare le voci memorizzate nella cache utilizzando una sintassi simile a SQL. Possiamo scrivere query SELECT e DELETE per trovare ed eliminare le voci. NCache non supporta query INSERT o UPDATE. Come una query SELECT del database, possiamo recuperare proiezioni, interi oggetti memorizzati nella cache o solo chiavi. Anche, NCache supporta query di base e operatori logici e funzioni di aggregazione.
Ad esempio, se stiamo archiviando prodotti, possiamo scrivere una query come SELECT FROM Product WHERE UnitPrice <= 5.00` per trovare tutti i prodotti memorizzati nella cache con prezzi inferiori a 5. Per ulteriori esempi su come cercare elementi e utilizzare operatori e funzioni di aggregazione , controlla usando Query SQL con cache distribuita.
Indicizzazione
A differenza dei database relazionali, per trovare elementi in base ad altri attributi, NCache richiede indici. In caso contrario, dovrebbe eseguire la scansione dell'intera cache per trovare gli elementi e le relative proprietà. Farà NCache lento. Con gli indici, le nostre operazioni di ricerca sono più veloci. Per utilizzare una proprietà di un oggetto in una query di ricerca simile a SQL, dobbiamo prima indicizzarla. Possiamo indicizzare tutti i campi primitivi pubblici, privati e protetti e le proprietà di un oggetto. Tieni presente che non possiamo indicizzare campi o proprietà di tipo riferimento. Una volta NCache aggiunge un elemento a un indice, viene restituito come risultato di una query se soddisfa i criteri delle nostre query di ricerca.
Esistono due meccanismi con cui definire gli indici NCache: indicizzazione statica e dinamica.
Indicizzazione statica
Per cercare oggetti personalizzati, dobbiamo prima indicizzarli. Possiamo definire gli indici tramite modifiche alla configurazione o a livello di codice.
Creazione di indici tramite configurazione
Possiamo creare indici usando il NCache Manager o un cmdlet di Powershell. Innanzitutto, dovremmo interrompere la nostra cache, creare i nostri indici e riavviarla. IL NCache Manager ci chiede di caricare l'assembly con le nostre classi e di scegliere quali proprietà e campi indicizzare. Dopo di che, NCache indicizza automaticamente le nuove voci. Per maggiori dettagli sul NCache Gestore e PowerShell Add-QueryIndex
cmdlet, controlla Configura indici di query.
Creazione di indici a livello di codice
Per creare indici a livello di codice, dobbiamo annotare i campi dei nostri oggetti per indicizzarli. NCache ha la QueryIndexed
attributo per indicizzare i campi e le proprietà.
Ad esempio, per indicizzare il nome di un prodotto e il prezzo unitario, dobbiamo annotarlo Name
ed UnitPrice
proprietà. Come questo,
1 2 3 4 5 6 7 8 9 10 11 |
public class Product { public int ID { get; set } [QueryIndexed] public string Name { get; set } [QueryIndexed] public decimal UnitPrice { get; set } public decimal Weight { get; set } } |
Per impostazione predefinita, NCache indici dei nomi dopo le proprietà annotate. Ma possiamo specificare un nome diverso con il QueryIndexed
attributo. Questa funzionalità è utile quando si lavora con due applicazioni client che utilizzano nomi diversi per la proprietà che si desidera indicizzare. Ad esempio, se un'applicazione utilizza UnitPrice
e un altro, pricePerUnit
; possiamo usare price
come nome dell'indice in entrambe le applicazioni e scrivere le nostre query di ricerca simili a SQL utilizzando price
anziché.
Oltre ad annotare le singole proprietà, possiamo annotare le classi con l' QueryIndexable
attributo. Da questa parte, NCache indicizza automaticamente tutte le proprietà e i campi pubblici. Ma dobbiamo annotare i campi privati con QueryIndexed
. E se non vogliamo indicizzare alcune proprietà, dobbiamo annotarle con NonQueryIndexed
. Indicizziamo una classe solo se dobbiamo indicizzare tutte le proprietà. Ma adottiamo l'approccio delle sole proprietà di indicizzazione di cui abbiamo bisogno per la ricerca poiché l'aggiunta di troppi indici ha un sovraccarico di memoria e prestazioni.
Ad esempio, per indicizzare tutte le proprietà di un prodotto, escluse Weight
, dobbiamo annotare la classe e il file Weight
proprietà. Come questo,
1 2 3 4 5 6 7 8 9 10 11 12 |
[QueryIndexable] public class Product { public int ID { get; set } public string Name { get; set } public decimal UnitPrice { get; set } [NonQueryIndexed] public decimal Weight { get; set } } |
Per ulteriori dettagli sulle annotazioni dell'indice, controllare Definisci gli indici a livello di codice.
Indicizzazione dinamica
Definiamo alcuni attributi delle nostre voci memorizzate nella cache in fase di esecuzione utilizzando il NCache cliente. Non possiamo usare le annotazioni per indicizzare questi attributi. Per gli attributi di runtime, NCache utilizza l'indicizzazione dinamica. Esistono tre tipi di indici dinamici: gruppo, tag e indici di tag con nome.
Indice del gruppo
Con Gruppi, possiamo partizionare logicamente le nostre voci per efficienza. I gruppi funzionano come categorie logiche. Ad esempio, possiamo utilizzare i gruppi per i nostri "clienti più importanti" e "prodotti acquistati di frequente". Possiamo recuperare e rimuovere tutte le voci appartenenti allo stesso gruppo. Inoltre, possiamo scrivere query SELECT simili a SQL utilizzando i gruppi. NCache indicizza automaticamente i gruppi. Quando aggiungiamo una voce a un gruppo che non esiste, NCache crea un indice per il gruppo e memorizza tutte le voci che appartengono a un gruppo nello stesso indice. Per saperne di più su Gruppi, controlla Dati cache di gruppo: una panoramica.
Indice dei tag
I tag sono identificatori di stringhe che associamo alle nostre voci. Con i tag, possiamo organizzare meglio i nostri dati poiché possiamo recuperare e rimuovere le voci in base ai loro tag. A differenza dei gruppi, possiamo associare uno o più tag alle voci della nostra cache. Ad esempio, possiamo classificare i nostri clienti in base alla loro posizione utilizzando "East Coast Customers" e "West Coast Customers" come tag. NCache supporta la ricerca e l'eliminazione di voci utilizzando un nome di tag o la sintassi di query simile a SQL. Possiamo trovare tutti gli elementi che contengono uno o più tag, ad esempio: per ogni nuovo tag, NCache crea un indice di tag e salva tutti gli elementi correlati nella cache con quell'indice.
Indice dei tag denominati
I tag con nome sono tag migliorati. A differenza dei gruppi e dei tag, che supportano solo le stringhe come identificatori, con i tag con nome possiamo associare tipi di dati primitivi, stringhe e date alle nostre voci. I tag con nome sono un elenco di coppie chiave-valore allegate alle nostre voci in fase di esecuzione.
Ad esempio, possiamo utilizzare i tag con nome per memorizzare lo sconto che diamo ai clienti abituali.
Per cercare ed eliminare le voci utilizzando i nomi dei tag o la sintassi simile a SQL, NCache crea automaticamente un indice quando aggiungiamo voci con tag denominati che non esistono. Anche, NCache memorizza tutti gli elementi memorizzati nella cache correlati in quell'indice. Poiché gli indici Named Tag supportano non solo le stringhe ma tutti i tipi primitivi, abbiamo l'alternativa di cercare elementi con una gamma più ampia di tipi di dati.
Per informazioni sui tag e sui tag con nome, controlla il file Tag dei dati della cache ed Tag denominati con dati della cache guide.
Conclusione
Grazie agli indici e alle query distribuite, NCache offre funzionalità di ricerca in tempo reale con una sintassi simile a SQL. Senza indici, NCache dovrebbe scansionare l'intera cache per trovare le nostre voci. Ecco perché NCache ha bisogno di indici. Ricordiamo che dobbiamo prima indicizzare tutti gli attributi ricercabili dei nostri articoli. Possiamo definire i nostri indici tramite configurazione, a livello di programmazione o con una combinazione di entrambi gli approcci. E indicizziamo solo le proprietà di cui abbiamo bisogno nelle nostre query. Gli indici hanno costi di memoria e prestazioni.
Per maggiori dettagli su come creare indici e come funzionano le query SQL, controlla il file Guida all'indicizzazione ed Query SQL: panoramica sul comportamento e sull'utilizzo.