Blocco con controllo delle versioni degli elementi della cache (blocco ottimistico)
Mentre Blocco pessimistico è un approccio molto utile, esiste una limitazione nel suo utilizzo, un elemento non può essere utilizzato a meno che non venga eseguita completamente almeno un'operazione. Ciò significa che l'elemento rimane bloccato finché non viene eseguita completamente un'attività sull'elemento. Ciò può causare la fame del thread se un elemento rimane bloccato per un lungo periodo.
Note:
Questa funzionalità è disponibile anche in NCache Professional.
È qui che il blocco ottimistico torna utile da allora NCache utilizza il controllo delle versioni degli elementi della cache. CacheItemVersion
è una proprietà associata a ogni elemento della cache. È un valore numerico che rappresenta la versione dell'elemento memorizzato nella cache, che si incrementa di uno ad ogni aggiornamento di un elemento. Questa proprietà consente di monitorare se si verificano modifiche in un elemento o meno. Quando recuperi un elemento dalla cache, recuperi anche la sua versione corrente nella cache.
Per le applicazioni ad alta intensità di lettura, il blocco ottimistico è preferibile al blocco pessimistico.
Quando utilizzare il blocco ottimistico
Nell'esempio precedente, avevamo un unico conto bancario utilizzato da due utenti contemporaneamente. Supponiamo che uno degli utenti abbia acquisito il blocco per aver eseguito un'operazione di deposito sul conto bancario. L'Utente2 attende che l'Utente1 rilasci la serratura per poter effettuare la transazione di prelievo. Considera che l'Utente1 entra in uno stato instabile a causa di problemi di connettività di rete senza liberare il blocco. L'utente2 continua ad aspettare che rilasci il blocco senza essere a conoscenza di eventuali problemi di connettività, quindi passa allo stato di fame finché il primo utente non rilascia il blocco.
Per evitare questo tipo di problema, Optimistic Locking è una soluzione utile. Utilizzando questo tipo di blocco, se l'Utente1 desidera aggiornare l'account, può aggiornare l'account senza bloccarlo e la versione dell'elemento verrà aggiornata di conseguenza. Ora, quando l'Utente2 desidera aggiornare i dati, otterrà la versione aggiornata in base alla versione dell'articolo e ciò garantirà che non si verifichino problemi di integrità dei dati. Se un utente opera sui dati con la versione precedente dell'elemento, l'operazione fallirà poiché ha una versione dell'elemento obsoleta.
CacheItemVersion
aggiunge una dimensione aggiuntiva allo sviluppo dell'applicazione utilizzando NCache. La concorrenza ottimistica può essere ottenuta nelle applicazioni di NCache Controllo delle versioni degli articoli.
Quando un elemento viene aggiunto alla cache, la versione dell'elemento della cache viene restituita al client della cache. Questo valore indica il numero di aggiornamenti eseguiti su dati particolari. Ad ogni aggiornamento, il valore della versione dell'articolo aumenta.
Prerequisiti
- Per conoscere i prerequisiti standard richiesti per lavorare con all NCache Per le funzionalità lato client fare riferimento alla pagina specificata Prerequisiti dell'API lato client.
- Per i dettagli dell'API, fare riferimento a: Aggiungi, ICache, CacheItem, CacheItemVersion, contiene, Contare, OttieniSeNewer, inserire, Rimuovere.
Recupera e aggiorna l'articolo con la versione dell'articolo
An Aggiungi operazione restituisce il CacheItemVersion
. Se un elemento viene aggiunto per la prima volta, viene restituito un valore lungo contenente il TimeStamp della sua creazione. Questa versione verrà incrementata di "1" quando si eseguono operazioni su questa chiave in futuro.
Il blocco ottimistico garantisce che l'utente ottenga sempre la copia più aggiornata dell'elemento dalla cache. Se l'utente continua a eseguire funzioni sulla versione obsoleta, NCache genera un'eccezione, in modo che l'utente ottenga l'elemento aggiornato dalla cache.
Nell'esempio seguente una cache viene utilizzata da più applicazioni. La cache contiene i dati dei prodotti. UN CacheItem
viene aggiunto alla cache. Entrambe le applicazioni recuperano l'elemento con la versione corrente, diciamo versione. Applicazione1 modifica il nome del prodotto e quindi reinserisce l'elemento nella cache, aggiornando la versione dell'elemento alla nuova versione. L'applicazione 2 contiene ancora l'elemento con la versione. Se Applicazione2 aggiorna le unità dell'articolo in magazzino e reinserisce l'articolo nella cache, l'inserimento avrà esito negativo. Application2 dovrà recuperare la versione aggiornata per eseguire l'operazione su questo CacheItem
.
Note:
Puoi aggiungere un elemento nella cache usando entrambi Aggiungi or inserire metodi.
- I
Add
Il metodo aggiunge un nuovo elemento alla cache e salva la versione dell'elemento per la prima volta. - I
Insert
Il metodo aggiunge un elemento nella cache, se non è già presente, mentre sovrascrive il valore di un'ora esistente e aggiorna la versione dell'elemento.
Le sezioni di codice seguenti illustrano le operazioni eseguite dall'applicazione.
// Precondition: Cache is already connected
// An item is added in the cache with itemVersion
// Specify the key of the cacheItem
string key = "Product:1001";
// Initialize the cacheItemVersion
CacheItemVersion version = null;
// Get the cacheItem previously added in the cache with the version
CacheItem cacheItem = cache.GetCacheItem(key, ref version);
// If result is not null
if (cacheitem != null)
{
// CacheItem is retrieved successfully with the version
// If result is Product type
var prod = new Product();
prod = cacheItem.GetValue<Product>();
prod.UnitsInStock++;
// Create a new cacheItem with updated value
var updateItem = new CacheItem(prod);
//Set the itemversion. This version will be used to compare the
// item version of cached item
updateItem.Version = version;
cache.Insert(key, updateItem);
// If it matches, the insert will be successful, otherwise it will fail
}
else
{
// Item could not be retrieved due to outdated CacheItemVersion
}
Note:
Per garantire che l'operazione sia a prova di errore, si consiglia di gestire eventuali potenziali eccezioni all'interno dell'applicazione, come spiegato in Gestione dei guasti.
Recupera l'elemento se nella cache esiste una versione più recente
I GetIfNewer
Il metodo può essere utilizzato per recuperare l'elemento esistente se nella cache è disponibile una versione più recente. Specificando la versione corrente come argomento della chiamata al metodo, la cache restituisce il risultato appropriato.
Se la versione specificata è inferiore a quella nella cache, solo allora il metodo restituisce un nuovo Item else nullo verrà restituito.
L'esempio seguente aggiunge un elemento nella cache con la chiave Product:1001
e la versione dell'elemento, quindi la recupera se è disponibile una versione più recente utilizzando il file GetIfNewer
metodo che recupera un elemento utilizzando la versione dell'elemento della cache.
// Get updated product from database against given product ID
Product product = FetchProductByProductID(1001);
// Generate a unique key for this item
string key = $"Product:{product.ProductID}";
// Create a new CacheItem
var item = new CacheItem(product);
// Add CacheItem to cache with new itemversion
CacheItemVersion version = cache.Insert(key, item);
// Get object from cache
var result = cache.GetIfNewer<Product>(key, ref version);
// Check if updated item is available
if (result != null)
{
// An item with newer version is available
if (result is Product)
{
// Perform operations according to business logic
}
}
else
{
// No new itemVersion is available
}
Rimuovi l'articolo con la versione dell'articolo
Un elemento può essere rimosso dalla cache utilizzando un sovraccarico di Rimuovere, in base alla versione dell'elemento. Tuttavia, se la versione dell'elemento è diversa da quella nella cache, viene specificata un'eccezione.
L'esempio seguente mostra come rimuovere un elemento dalla cache specificando la versione dell'elemento utilizzando il file Rimuovere metodo.
Consiglio
Puoi monitorare/verificare la rimozione:
- Contatore "Conteggio cache" in entrata NCache Monitorare or Contatori PerfMon.
- utilizzando
cache.Contains
una volta trascorso l'intervallo di scadenza. - utilizzando
cache.Count
prima e dopo aver specificato la scadenza.
// Get updated product from database against given product ID
Product product = FetchProductByProductID(1001);
// Cache key remains the same for this product
string key = $"Product:{product.ProductID}";
// Create a new CacheItem
var item = new CacheItem(product);
// Insert CacheItem to cache with new itemversion
CacheItemVersion version = cache.Insert(key, item);
// Remove the item from the cache using the itemVersion
cache.Remove(key, null, version);
Topologia Comportamento saggio
- Per lo specchio e la cache replicata
Nel Specchio Topologia, quando un elemento viene aggiunto o aggiornato, la sua versione viene generata nel nodo attivo e la stessa versione viene quindi replicata nel nodo passivo insieme all'elemento in modo che quando un nodo attivo diventa passivo, la versione dell'elemento rimane la stessa.
Nel replicato Topologia: il client è connesso a un nodo e la versione dell'elemento viene generata in un nodo che riceve l'operazione di aggiornamento/aggiunta del client, quindi la stessa versione dell'elemento insieme all'elemento viene replicata su tutti gli altri nodi per la coerenza dei dati.
- Per la cache partizionata e di replica della partizione
Nel Partitioned Topologia, la versione dell'elemento viene generata ed esiste sullo stesso nodo che contiene l'elemento e durante il trasferimento dello stato anche la versione viene trasferita insieme all'elemento nel caso in cui l'elemento si sposti su un altro nodo.
Nel Partizione-Replica Topologia, la versione viene generata sul nodo attivo, che contiene l'elemento e la stessa versione insieme all'elemento viene quindi replicata nella sua replica per coerenza dei dati e durante il trasferimento di stato anche la versione viene trasferita insieme all'elemento nel caso in cui l'elemento si sposti in un altro nodo.
- Cache cliente
Nel Cache cliente, tutte le informazioni relative alla versione vengono conservate nella cache in cluster e ogni volta che viene richiamata un'API correlata alla versione, l'utente ottiene la sua versione dalla cache in cluster.
Risorse addizionali
NCache fornisce un'applicazione di esempio per il blocco dell'elemento GitHub.
Vedere anche
.NETTO: Alachisoft.NCache.Memorizzazione.della.cache spazio dei nomi.
Giava: com.alachisoft.ncache.cache.di.runtime spazio dei nomi.
Node.js: Cache classe.
Pitone: ncache.cache.di.runtime classe.