objectcache net framework example cache c# .net memorycache

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.