c# - example - memory cache.net framework
¿Para qué sirve MemoryCache.AddOrGetExisting? (3)
El comportamiento de MemoryCache.AddOrGetExisting se describe como:
Agrega una entrada de caché en el caché usando la clave especificada y un valor y un valor de vencimiento absoluto.
Y que vuelva.
Si existe una entrada de caché con la misma clave, la entrada de caché existente; De lo contrario, nulo.
¿Cuál es el propósito de un método con estas semánticas? ¿Qué es un ejemplo de esto?
A menudo hay situaciones en las que solo desea crear una entrada de caché si no existe una entrada coincidente (es decir, no desea sobrescribir un valor existente).
AddOrGetExisting
permite hacer esto atómicamente. Sin AddOrGetExisting
sería imposible realizar get-test-set de una manera atómica y segura para subprocesos. Por ejemplo:
Thread 1 Thread 2
-------- --------
// check whether there''s an existing entry for "foo"
// the call returns null because there''s no match
Get("foo")
// check whether there''s an existing entry for "foo"
// the call returns null because there''s no match
Get("foo")
// set value for key "foo"
// assumes, rightly, that there''s no existing entry
Set("foo", "first thread rulez")
// set value for key "foo"
// assumes, wrongly, that there''s no existing entry
// overwrites the value just set by thread 1
Set("foo", "second thread rulez")
(Vea también el método Interlocked.CompareExchange
, que permite un equivalente más sofisticado en el nivel variable, y también las entradas de wikipedia en test-and-set y compare-and-swap ).
La respuesta de LukeH es correcta. Debido a que las otras respuestas indican que la semántica del método podría interpretarse de manera diferente, creo que vale la pena señalar que AddOrGetExisting
de hecho, no actualizará las entradas de caché existentes.
Entonces este código
Console.WriteLine(MemoryCache.Default.AddOrGetExisting("test", "one", new CacheItemPolicy()) ?? "(null)"); Console.WriteLine(MemoryCache.Default.AddOrGetExisting("test", "two", new CacheItemPolicy())); Console.WriteLine(MemoryCache.Default.AddOrGetExisting("test", "three", new CacheItemPolicy()));
imprimirá
(null) one one
Otra cosa a tener en cuenta: cuando AddOrGetExisting
encuentra una entrada de caché existente, no eliminará la CachePolicy pasada a la llamada. Esto puede ser problemático si utiliza monitores de cambio personalizados que configuran mecanismos de seguimiento de recursos costosos. Normalmente, cuando se desaloja una entrada de caché, el sistema de caché llama a Dipose()
en sus ChangeMonitors. Esto le da la oportunidad de cancelar el registro de eventos y similares. Sin embargo, cuando AddOrGetExisting
devuelve una entrada existente, debes encargarte de eso.
Realmente no he usado esto, pero creo que un posible caso de uso es si desea actualizar incondicionalmente el caché con una nueva entrada para una clave en particular y desea eliminar explícitamente la entrada antigua que se está devolviendo.