The main purpose of any caching mechanism is to improve the performance of the application. As an ASP.NET developer you probably know about web forms, ASP.NET MVC may also have used the Cache object to cache application data. This is often referred to as server-side data caching and is a feature available in the framework. Although ASP.NET Core does not have such a Cache object, you can implement in-memory caching quite easily. This article guides you on how to do it.
Before going any further you need to create a new ASP.NET application based on the Web Application project template. You choose as shown below:
Next, the steps below cover step by step, step by step, to build and test features proposed by in-momory caching.
1. Enable In-memory caching in the Startup class
Unlike ASP.NET web forms and ASP.NET MVC, ASP.NET Core doesn’t have a built-in Cache Object that you can use directly inside the Controller . Here, in-memory caching works through dependency injection and the first step is to register the in-memory caching service in the Startup class. So, open this class and put the code in the ConfigureServices()
. Edit the ConfigureServices()
as shown below:
1 2 3 4 5 6 | <span class="token keyword">public</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">ConfigureServices</span> <span class="token punctuation">(</span> <span class="token class-name">IServiceCollection</span> services <span class="token punctuation">)</span> <span class="token punctuation">{</span> services <span class="token punctuation">.</span> <span class="token function">AddMvc</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> services <span class="token punctuation">.</span> <span class="token function">AddMemoryCache</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
To be able to use in-memory caching in your application, you need to call the AddMemoryCache()
in the service collection. This is the default implementation of an in-memory cache – an IMemoryCache
object – that can be IMemoryCache
to controllers.
2. In-memory caching uses dependency injection to inject the cache object
Next, open HomeController
and edit it like the code below:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">HomeController</span> <span class="token punctuation">:</span> <span class="token type-list"><span class="token class-name">Controller</span></span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token class-name">IMemoryCache</span> cache <span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token function">HomeController</span> <span class="token punctuation">(</span> <span class="token class-name">IMemoryCache</span> cache <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> cache <span class="token operator">=</span> cache <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token range operator">..</span> <span class="token range operator">..</span> <span class="token punctuation">}</span> |
As you can see, the above code declares a private variable of ImemoryCache
. This is the variable assigned in the constructor. Constructor gets the cache parameter through DI, then this cache object is stored in local variable for later use.
3. Use the Set () method to store an item in the cache
Once you have an IMemoryCache
object you can read and write data with it. Adding an entry to the cache is pretty straightforward and straightforward.
1 2 3 4 5 6 | <span class="token keyword">public</span> <span class="token return-type class-name">IActionResult</span> <span class="token function">Index</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Set</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"timestamp"</span> <span class="token punctuation">,</span> DateTime <span class="token punctuation">.</span> Now <span class="token punctuation">.</span> <span class="token function">ToString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">View</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
The above code sets a cached data in the Index()
action. This is done by using the Set<T>()
of the IMemoryCache
object. The first parameter to the method is a key that identifies the cache. The second parameter is the value of the key. In this example we store a key and value as a string, but you can also store it with other data types (built-in and built-in types).
4. Use the Get()
to retrieve an item from the cache
After you add data to the cache, you desire to receive them somewhere in the application. You do this using the Get()
. Use the code below.
1 2 3 4 5 6 | <span class="token keyword">public</span> <span class="token return-type class-name">IActionResult</span> <span class="token function">Show</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name"><span class="token keyword">string</span></span> timestamp <span class="token operator">=</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Get</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"timestamp"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">View</span> <span class="token punctuation">(</span> <span class="token string">"Show"</span> <span class="token punctuation">,</span> timestamp <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
The above code receives data from the cache at another action ( Show()
) of the HomeController
. The Get()
specifies the type of item and its key. We try to display the data retrieved from the cache, here it is a timestamp.
1 2 3 4 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token punctuation">></span></span> TimeStamp : @Model <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h2</span> <span class="token punctuation">></span></span> @Html.ActionLink("Go back", "Index", "Home") <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h2</span> <span class="token punctuation">></span></span> |
Try to open page / Home / Show, see the results as shown:
5. Use TryGet()
to check for existence of the key
If you look at the previous example, you will find that every time you navigate to /Home/Index
, a new timestamp is assigned to the cache item. This is because we do not give any check if the key already exists or not before assigning the value. There are two ways to do that inside the Index()
action. Please observe both as the code below:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token comment">//first way</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token keyword">string</span> <span class="token punctuation">.</span> IsNullOrEmpty <span class="token punctuation">(</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Get</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"timestamp"</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Set</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"timestamp"</span> <span class="token punctuation">,</span> DateTime <span class="token punctuation">.</span> Now <span class="token punctuation">.</span> <span class="token function">ToString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//second way</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">TryGetValue</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"timestamp"</span> <span class="token punctuation">,</span> <span class="token keyword">out</span> <span class="token class-name"><span class="token keyword">string</span></span> timestamp <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Set</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"timestamp"</span> <span class="token punctuation">,</span> DateTime <span class="token punctuation">.</span> Now <span class="token punctuation">.</span> <span class="token function">ToString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
The first method is the same as the Get()
you used earlier. However, this time it uses the if
block.
The second one looks cleaner. It uses the TryGet()
to receive an item. This method returns boolean type. True
if the key already exists in the cache, False
otherwise. The advantage of this approach is that the value of the cache is given an out
parameter for later use. That way it is possible to both check the existence and get the value in the same method.
6. Use GetOrCreate()
to add an item if it doesn’t already exist
Sometimes you need to get an existing item from the cache and if the item doesn’t already exist then you want to add it. This makes the code more concise. With the same line of code, you can both get values and add new ones if you don’t already exist, helping to reduce the existence check.
1 2 3 4 5 6 7 8 | <span class="token keyword">public</span> <span class="token return-type class-name">IActionResult</span> <span class="token function">Show</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name"><span class="token keyword">string</span></span> timestamp <span class="token operator">=</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">GetOrCreate</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"timestamp"</span> <span class="token punctuation">,</span> entry <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> DateTime <span class="token punctuation">.</span> Now <span class="token punctuation">.</span> <span class="token function">ToString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">View</span> <span class="token punctuation">(</span> <span class="token string">"Show"</span> <span class="token punctuation">,</span> timestamp <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
7. Set your timeout by absolute time and unused time
In the previous example, an item cache when added is retained in the cache unless it is removed using the Remove()
. You can also set an absolute and relative time on an item cache. An absolute timeframe means that the cached item will be removed at an apparent time and date. The relative time here is that the cache will be removed after a certain amount of time (no access).
To set this expiration time use the MemoryCacheEntryOptions
object. The code below is how to set it up:
1 2 3 4 5 6 7 8 | <span class="token class-name">MemoryCacheEntryOptions</span> options <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">MemoryCacheEntryOptions</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> options <span class="token punctuation">.</span> AbsoluteExpiration <span class="token operator">=</span> DateTime <span class="token punctuation">.</span> Now <span class="token punctuation">.</span> <span class="token function">AddMinutes</span> <span class="token punctuation">(</span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> options <span class="token punctuation">.</span> SlidingExpiration <span class="token operator">=</span> TimeSpan <span class="token punctuation">.</span> <span class="token function">FromMinutes</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Set</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"timestamp"</span> <span class="token punctuation">,</span> DateTime <span class="token punctuation">.</span> Now <span class="token punctuation">.</span> <span class="token function">ToString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> options <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
AbsoluteExpiration
above indicates that the cache will expire 2 minutes from the current point in time regardless of whether the cache is accessed or not. And SlidingExpiration
will decide the cache will expire after 1 minute if it is not accessed even if it still has AbsoluteExpiration
‘s term.
8. Can use callbacks when the items in the cache are removed
There may be times when you want to report whenever the data in the cache is removed. For example, an item removed by calling the Remove()
, can also be removed due to expiration due to the AbsoluteExpiration
or SlidingExpiration
. Then, we need to set up the RegisterPostEvictionCallback
option as below:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token class-name">MemoryCacheEntryOptions</span> options <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">MemoryCacheEntryOptions</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> options <span class="token punctuation">.</span> AbsoluteExpiration <span class="token operator">=</span> DateTime <span class="token punctuation">.</span> Now <span class="token punctuation">.</span> <span class="token function">AddMinutes</span> <span class="token punctuation">(</span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> options <span class="token punctuation">.</span> SlidingExpiration <span class="token operator">=</span> TimeSpan <span class="token punctuation">.</span> <span class="token function">FromMinutes</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Callback when cached item is removed</span> options <span class="token punctuation">.</span> <span class="token function">RegisterPostEvictionCallback</span> <span class="token punctuation">(</span> MyCallback <span class="token punctuation">,</span> <span class="token keyword">this</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Set</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"timestamp"</span> <span class="token punctuation">,</span> DateTime <span class="token punctuation">.</span> Now <span class="token punctuation">.</span> <span class="token function">ToString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> options <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
In the above example, the function callback name is MyCallback
. The second argument is a state object, you will pass it to the functon call back. Here we pass the instance of HomeController
.
The MyCallback
function looks like below:
1 2 3 4 5 6 7 | <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">MyCallback</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">object</span></span> key <span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">object</span></span> <span class="token keyword">value</span> <span class="token punctuation">,</span> <span class="token class-name">EvictionReason</span> reason <span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">object</span></span> state <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name"><span class="token keyword">var</span></span> message <span class="token operator">=</span> <span class="token interpolation-string"><span class="token string">$"Cache entry was removed : </span><span class="token interpolation"><span class="token punctuation">{</span> <span class="token expression language-csharp">reason</span> <span class="token punctuation">}</span></span> <span class="token string">"</span></span> <span class="token punctuation">;</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> HomeController <span class="token punctuation">)</span> state <span class="token punctuation">)</span> <span class="token punctuation">.</span> cache <span class="token punctuation">.</span> <span class="token function">Set</span> <span class="token punctuation">(</span> <span class="token string">"callbackMessage"</span> <span class="token punctuation">,</span> message <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Observe this code carefully. MyCallback()
is a private static function inside the HomeController
. It has 4 parameters. The first two parameters are the key and value of the item that has just been cleared from the cache. The third parameter specifies the reason why the item was removed. EvictionReason
is an enumeration and lists various reasons such as: Expired , Removed, and Replaced .
Inside the callback we simply save the content of the message talking about the cause of the removal. This message is also stored in the cache.
Next, we will display this message on the UI as below code:
Action Show()
:
1 2 3 4 5 6 7 8 | <span class="token keyword">public</span> <span class="token return-type class-name">IActionResult</span> <span class="token function">Show</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name"><span class="token keyword">string</span></span> timestamp <span class="token operator">=</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Get</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"timestamp"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> ViewData <span class="token punctuation">[</span> <span class="token string">"callbackMessage"</span> <span class="token punctuation">]</span> <span class="token operator">=</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Get</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"callbackMessage"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">View</span> <span class="token punctuation">(</span> <span class="token string">"Show"</span> <span class="token punctuation">,</span> timestamp <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
html:
1 2 3 4 5 6 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token punctuation">></span></span> TimeStamp : @Model <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h3</span> <span class="token punctuation">></span></span> @ViewData["callbackMessage"] <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h3</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h2</span> <span class="token punctuation">></span></span> @Html.ActionLink("Go back", "Index", "Home") <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h2</span> <span class="token punctuation">></span></span> |
Run the application:
9. Set the priority for the item to be cached
Just as you can set a cache expiration policy, you can also set its priority. If the server has limited memory, then this priority determines which items will be deleted in order to regain memory. To set the priority you use MemoryCacheEntryOptions
again.
1 2 3 4 5 6 | <span class="token class-name">MemoryCacheEntryOptions</span> options <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">MemoryCacheEntryOptions</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> options <span class="token punctuation">.</span> Priority <span class="token operator">=</span> CacheItemPriority <span class="token punctuation">.</span> Normal <span class="token punctuation">;</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Set</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"timestamp"</span> <span class="token punctuation">,</span> DateTime <span class="token punctuation">.</span> Now <span class="token punctuation">.</span> <span class="token function">ToString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> options <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
CacheItemPriority
is an enum, it has four priorities include: Low, Normal, High and NeverRemove Based on the priority on the cache will be deleted from the item with a low priority to high, individual NeverRemove
will not be deleted for any reason.
10. Can establish a dependency between multiple item caches
You can also set a dependency between the item cache so that when an item is deleted all dependent items are also deleted with it. To see how it works, edit the Index()
action like the code below:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">public</span> <span class="token return-type class-name">IActionResult</span> <span class="token function">Index</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name"><span class="token keyword">var</span></span> cts <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">CancellationTokenSource</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> cache <span class="token punctuation">.</span> <span class="token function">Set</span> <span class="token punctuation">(</span> <span class="token string">"cts"</span> <span class="token punctuation">,</span> cts <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token class-name">MemoryCacheEntryOptions</span> options <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">MemoryCacheEntryOptions</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> options <span class="token punctuation">.</span> <span class="token function">AddExpirationToken</span> <span class="token punctuation">(</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">CancellationChangeToken</span> <span class="token punctuation">(</span> cts <span class="token punctuation">.</span> Token <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> options <span class="token punctuation">.</span> <span class="token function">RegisterPostEvictionCallback</span> <span class="token punctuation">(</span> MyCallback <span class="token punctuation">,</span> <span class="token keyword">this</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Set</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"timestamp"</span> <span class="token punctuation">,</span> DateTime <span class="token punctuation">.</span> Now <span class="token punctuation">.</span> <span class="token function">ToString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> options <span class="token punctuation">)</span> <span class="token punctuation">;</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Set</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"key1"</span> <span class="token punctuation">,</span> <span class="token string">"Hello World!"</span> <span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">CancellationChangeToken</span> <span class="token punctuation">(</span> cts <span class="token punctuation">.</span> Token <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Set</span> <span class="token generic class-name"><span class="token punctuation"><</span> <span class="token keyword">string</span> <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"key2"</span> <span class="token punctuation">,</span> <span class="token string">"Hello Universe!"</span> <span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">CancellationChangeToken</span> <span class="token punctuation">(</span> cts <span class="token punctuation">.</span> Token <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">View</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
The code starts by creating a CancellationTokenSource
object and the object is stored as a cts
independent cache item. Next, MemoryCacheEntryOptions
is created as before. Then the AddExpirationToken()
is called to specify an expiration token. If the token is active, the item remains in the cache, and if the token is destroyed, the item will also be removed from the cache. After the item is removed from the cache, MyCallback
will be called as mentioned in the previous section. Next the code creates 2 more items (key1 and key2). While creating these two items, the third parameter to be passed is a CancellationChangeToken
created earlier.
That means we have 3 keys: timestamp is the primary key, key1 and key2 are dependent on timestamp
. When the timestamp
is deleted, key1
and key2
also deleted. You can do it like the code below:
1 2 3 4 5 6 7 8 | <span class="token keyword">public</span> <span class="token return-type class-name">IActionResult</span> <span class="token function">Remove</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">CancellationTokenSource</span> cts <span class="token operator">=</span> cache <span class="token punctuation">.</span> <span class="token generic-method"><span class="token function">Get</span> <span class="token generic class-name"><span class="token punctuation"><</span> CancellationTokenSource <span class="token punctuation">></span></span></span> <span class="token punctuation">(</span> <span class="token string">"cts"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> cts <span class="token punctuation">.</span> <span class="token function">Cancel</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">RedirectToAction</span> <span class="token punctuation">(</span> <span class="token string">"Show"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
To test the results, you run the following urls in turn: /Home/Index
, /Home/Show
, /Home/Remove
11. Conclusion
The use of the cache is always necessary for any web application, as well as any language. So, with the detailed and clear instructions in the article hopefully will help the beginners to quickly grasp cache grasping. Thank you for watching the article.
Posts translated from source: