The 30-Day .NET Challenge Day 16: In-Memory Caching

Written by ssukhpinder | Published 2024/04/04
Tech Story Tags: dotnet | aspnetcore | c-sharp | beginners | coding | best-practices | programming | software-development

TLDRIn-memory caching involves temporarily storing frequently accessed data in the memory of the application server. It drastically reduces the need to retrieve data from the database for each request. To use MemoryCache, you need to add the Microsoft.Extensions.Caching.Memory package to your project.via the TL;DR App

Introduction

One of the major issues in an application's performance is the time it takes to respond from external data sources mostly databases. Challenges are hard when the database resides in a remote machine or experiencing heavy load. The in-memory caching acts as a better implementation to avoid performance bottlenecks.

Learning Objectives

  • How to use in-memory caching
  • Key benefits

Prerequisites for Developers

  • Basic understanding of C# programming language.

30 Day .Net Challenge

Getting Started

Usually, developers directly fetch information or data directly from the database. It is quite a straightforward and simple approach but can lead to performance issues when the database is under a heavy load, which impacts application performance and hampers UI experience.

    public Product GetProductById(int id)
    {
        // Fetching product data from the database every time
        var product = _dbContext.Products.FirstOrDefault(p => p.Id == id);
        return product;
    }

How to implement in-memory caching

In-memory caching involves temporarily storing frequently accessed data in the memory of the application server, drastically reducing the need to retrieve data from the database for each request.

    private static MemoryCache _cache = new MemoryCache(new MemoryCacheOptions());
    
    public Product GetProductById(int id)
    {
        // Fetching product data from the cache if available
        if (!_cache.TryGetValue(id, out Product product))
        {
            product = _dbContext.Products.FirstOrDefault(p => p.Id == id);
            _cache.Set(id, product, TimeSpan.FromMinutes(30));
        }
        return product;
    }

To use MemoryCache, you need to add the Microsoft.Extensions.Caching.Memory package to your project.

    dotnet add package Microsoft.Extensions.Caching.Memory

Create a class InMemoryCache with a function named GetProductById, which returns a class object of type Product.

    public static class InMemoryCache
    {
        private static MemoryCache _cache = new MemoryCache(new MemoryCacheOptions());
        private static ProductRepository _productRepository = new ProductRepository();
        public static Product GetProductById(int id)
        {
            if (!_cache.TryGetValue(id, out Product product))
            {
                Console.WriteLine("Fetching from database...");
                product = _productRepository.GetProductById(id);
                _cache.Set(id, product, TimeSpan.FromMinutes(30)); // Cache for 30 minutes
            }
            else
            {
                Console.WriteLine("Fetching from cache...");
            }
    
            return product;
        }
    }

Simulate the ProductRepository and relevant Product class

    // Simulating a product repository
    public class ProductRepository
    {
        public Product GetProductById(int id)
        {
            // Simulate database access
            return new Product { Id = id, Name = $"Product {id}" };
        }
    }
    
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

The call from the main method is as follows, and the relevant console output showcases data fetched from memory.

    #region Day 16: In-Memory Cache
    
    Console.WriteLine("Fetching product with ID 1 for the first time:");
    var product = InMemoryCache.GetProductById(1);
    Console.WriteLine($"Product Name: {product.Name}\n");
    
    Console.WriteLine("Fetching product with ID 1 again:");
    product = InMemoryCache.GetProductById(1); // This time, it should come from the cache
    Console.WriteLine($"Product Name: {product.Name}\n");
    
    #endregion

Key Benefits

  • Reduce database load
  • Improved application performance
  • Scalability

Complete Code on GitHub

GitHub — ssukhpinder/30DayChallenge.Net

C# Programming🚀

Thank you for being a part of the C# community! Before you leave:

Follow us: Youtube | X | LinkedIn | Dev.to Visit our other platforms: GitHub More content at C# Programming


Also published here.


Written by ssukhpinder | Programmer by heart | C# | Python | .Net Core | Xamarin | Angular | AWS
Published by HackerNoon on 2024/04/04