Swiftorial Logo
Home
Swift Lessons
Tutorials
Learn More
Career
Resources

Implementing Caching in .NET Applications

Introduction

Caching is a crucial technique to improve the performance and scalability of your .NET applications. It helps reduce database load, decreases response time, and improves the overall user experience. This tutorial will guide you through implementing caching in .NET applications using various caching mechanisms.

Types of Caching

There are several types of caching that you can use in .NET applications:

  • In-Memory Caching
  • Distributed Caching
  • Response Caching

In-Memory Caching

In-memory caching stores data in the memory of the web server. This is suitable for small to medium-sized applications running on a single server.

Setting Up In-Memory Caching

using Microsoft.Extensions.Caching.Memory;

public class InMemoryCache
{
    private readonly IMemoryCache _cache;

    public InMemoryCache(IMemoryCache memoryCache)
    {
        _cache = memoryCache;
    }

    public void SetCache(string key, object value)
    {
        var cacheEntryOptions = new MemoryCacheEntryOptions()
            .SetSlidingExpiration(TimeSpan.FromMinutes(5));

        _cache.Set(key, value, cacheEntryOptions);
    }

    public object GetCache(string key)
    {
        return _cache.TryGetValue(key, out var value) ? value : null;
    }
}

Distributed Caching

Distributed caching stores data in an external cache storage, making it suitable for large-scale applications or applications running on multiple servers. Commonly used distributed caches are Redis and NCache.

Setting Up Distributed Caching with Redis

using Microsoft.Extensions.Caching.Distributed;
using StackExchange.Redis;

public class RedisCache
{
    private readonly IDistributedCache _cache;

    public RedisCache(IDistributedCache cache)
    {
        _cache = cache;
    }

    public async Task SetCacheAsync(string key, string value)
    {
        var cacheEntryOptions = new DistributedCacheEntryOptions()
            .SetSlidingExpiration(TimeSpan.FromMinutes(5));

        await _cache.SetStringAsync(key, value, cacheEntryOptions);
    }

    public async Task GetCacheAsync(string key)
    {
        return await _cache.GetStringAsync(key);
    }
}

Response Caching

Response caching stores HTTP responses and reuses them to reduce the load on the server and improve performance. This is particularly useful for static content or responses that do not change frequently.

Setting Up Response Caching

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCaching();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseResponseCaching();
}

[HttpGet]
[ResponseCache(Duration = 60)]
public IActionResult Get()
{
    return Content("This is a cached response.");
}

Combining Caching Mechanisms

In many applications, you might use a combination of in-memory caching, distributed caching, and response caching to achieve optimal performance. The key is to determine what type of data should be cached and for how long.

Example of Combined Caching

public class CombinedCache
{
    private readonly IMemoryCache _memoryCache;
    private readonly IDistributedCache _distributedCache;

    public CombinedCache(IMemoryCache memoryCache, IDistributedCache distributedCache)
    {
        _memoryCache = memoryCache;
        _distributedCache = distributedCache;
    }

    public async Task SetCacheAsync(string key, object value)
    {
        var memoryCacheEntryOptions = new MemoryCacheEntryOptions()
            .SetSlidingExpiration(TimeSpan.FromMinutes(1));

        _memoryCache.Set(key, value, memoryCacheEntryOptions);

        var distributedCacheEntryOptions = new DistributedCacheEntryOptions()
            .SetSlidingExpiration(TimeSpan.FromMinutes(5));

        await _distributedCache.SetStringAsync(key, value.ToString(), distributedCacheEntryOptions);
    }

    public async Task GetCacheAsync(string key)
    {
        if (!_memoryCache.TryGetValue(key, out var value))
        {
            value = await _distributedCache.GetStringAsync(key);
            if (value != null)
            {
                _memoryCache.Set(key, value);
            }
        }

        return value;
    }
}