How to use Azure Cache for Redis in a .NET Core web app

How to use Azure Cache for Redis in a .NET Core web app

If you need a distributed cache and are planning on deploying your .NET Core web app to Azure, using Azure Cache for Redis as your cache provider is a good choice.

The steps below show you how to get started…


Create an Azure Cache for Redis instance using the portal

Search for ‘azure cache for redis’ on the portal and on the create screen fill in details such as resource group, DNS name, location and cache type.

Choose the same location as whatever app will be consuming your cache to minimise latency. When you’re just getting setup I’d recommend choosing the Basic C0 cache as this is the cheapest and you can always upgrade later. For all the other tabs just accept the defaults for the moment.

No alt text provided for this image

After Azure has finished creating your new cache, navigate into it and go to the Access keys page as shown below.

Copy the primary connection string somewhere as you’ll need to put this into your appsettings.json file in the next step.

No alt text provided for this image


Setup and configure your app

Install Microsoft.Extensions.Caching.StackExchangeRedis from NuGet.

Amend Startup.cs…

No alt text provided for this image

Add a connection string pointing to your Redis instance on Azure into your appsettings.json file. Remember you can get this from the Access keys page as shown above. In our real apps we’d likely store this value in Azure Key Vault.

No alt text provided for this image


Create a cache wrapper or helper class

At this stage your app should be able to set and read items in Azure Redis by instantiating a concrete instance of the IDistributedCache instance. The next step is to create a simple thin wrapper around this interface. It’s not 100% needed but it helps keep code that is using the cache a little bit neater.

Since .NET Core 3.0 Microsofts default JSON deserializer has been System.Text.Json, however it doesn’t support circular references so in the below example I’ve fallen back to using Newtonsoft. Note… according to Microsoft System.Text.Json will support circular references from .NET 6.0.

No alt text provided for this image


Inject IDistributedCache into your controller or service class

Since dependency injection is built into .NET Core and because we’ve registered the Redis Cache service in our Startup.cs file we can inject an instance of the IDistributedCache into our controller class…

No alt text provided for this image


Check the cache when retrieving data

Finally to use the cache when getting data… we can implement the cache-aside pattern. In this pattern we…

  • First check the cache for a particular key.
  • If it does not exist we read data from the DB and store it in the cache.
  • If it does exist in cache we use the cached version of the data.

Below I’m checking the cache for a list of products…

No alt text provided for this image

In this case I’ve not set any DistributedCacheEntryOptions meaning items will not expire. If you need to set absolute or sliding expirations on items you can set the relevant options when adding them to the cache.

Note.. I'm getting ALL products above just for simplicity... but be careful with unbounded queries as performance can degrade as new items are added over time.


Remove items from cache after they’ve been updated

When some data change occurs which means previously cached items are now stale we can remove items from the cache as below…

No alt text provided for this image

Here the list of products I previously cached is no longer valid as I’ve deleted one of them.

Depending on the situation we might not have to explicitly remove certain items from the cache like above. In many cases some staleness is acceptable so in this case we might set a sliding expiration of 1 hour or depending on the data just re-cache certain items overnight.


How to test your app is storing items in and reading from Azure Cache for Redis

To confirm everything is working as expected we can run the monitor command in the Redis console direct on the Azure portal...

No alt text provided for this image
No alt text provided for this image


Edson Canganjo

Software Engineer | C# | .NET Core | Vue.js | React

3y
Like
Reply
Ervin Kurushi

Senior Software Developer

3y

Great article. Most of them don't go to Azure and teach you how to use the portal. Might I suggest working with hashes next? Most articles I tried reading are confusing.

We use it. Was really easy to migrate the project, took 20 minutes.

Hany Fekry

Software Technical Lead at Elsewedy Electric. PMP, Prince2, Agile

3y

is there code difference between development and production environment regarding this subject?

To view or add a comment, sign in

More articles by Dave Callan

Insights from the community

Others also viewed

Explore topics