AuxiliaryLibraries.CacheManager 1.0.7

dotnet add package AuxiliaryLibraries.CacheManager --version 1.0.7                
NuGet\Install-Package AuxiliaryLibraries.CacheManager -Version 1.0.7                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AuxiliaryLibraries.CacheManager" Version="1.0.7" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AuxiliaryLibraries.CacheManager --version 1.0.7                
#r "nuget: AuxiliaryLibraries.CacheManager, 1.0.7"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install AuxiliaryLibraries.CacheManager as a Cake Addin
#addin nuget:?package=AuxiliaryLibraries.CacheManager&version=1.0.7

// Install AuxiliaryLibraries.CacheManager as a Cake Tool
#tool nuget:?package=AuxiliaryLibraries.CacheManager&version=1.0.7                

This library is a wrapper over Redis and uses the StackExchange library for dealing with Redis. The interesting part here is the way of creating cache keys and working easier with Redis.

Table of Contents

  • How it works
  • Naming convestions
  • What does ICacheService have for us
  • Configuration

How it works

The instruction for using this library is pretty straightforward. You need to inject an interface called ICacheService into your classes and set some configurations.

Naming convestions

The exciting feature of the library is, there is no need to set the cache key, the naming convention is generated according to the Entity Name and the parameters you passed. There is a very powerful naming convention manager here that reduces lots of time for us to manage our cache keys. The mechanism for creating cache keys is hidden (Encapsulated) in CacheConventions class. It decides what is the cache key based on the information you pass to it. Every key is based on the model you are using. This is the base of every key. Besides, cache keys have other parts as well. The where clause you have when you querying to the database is very important. The order by clause, page number and page size, id, and there are some other arguments for covering every demand.

// The cache key is generated according to the passed parameters to functions.

// Cache key for People
// Example function: GetAllPeople()
var cacheKey = CacheConventions.Cachekey<Person>();

// Cache key for a person with Id number 1
// Example function: GetPersonById(long id)
var cacheKey = CacheConventions.Cachekey<Person>(id: 1);

// Cache key for a people who are Students. To be specific, there is an argument named baseKey for distingushing the keys.
// Example function: 
// GetStudents() => _context.People.Where(x => x.Type == PersonType.Student).ToList();
var cacheKey = CacheConventions.Cachekey<Person>(baseKey: "Students");

// Cache key for People who creates after a specific time and sorted descendingly.
// Example function: 
// GetValidPeople() => _context.People.Where(x => x.CreateDate > DateTime.Today.AddMonths(2)).OrderByDescending(o => o.CreateDate).ToList();
var cacheKey = CacheConventions.Cachekey<Person>(predicate: x => x.CreateDate > DateTime.Today.AddMonths(2),
                                                   orderBy: x => x.OrderByDescending(o => o.CreateDate));

// Cache key for the second 10th page of People who creates after a specific time and sorted descendingly.
// Example function: 
// GetValidPeople(int page, int pageSize)
// {
//     page = page > 0 ? page - 1 ? 0;
//     return _context.People.Where(x => x.CreateDate > DateTime.Today.AddMonths(2))
//                           .OrderByDescending(o => o.CreateDate).Skip(page * pageSize).Take(pageSize).ToList();
// }
var cacheKey = CacheConventions.Cachekey<Person>(predicate: x => DateTime.Today.AddMonths(2),
                                                   orderBy: x => x.OrderByDescending(o => o.CreateDate)
                                                   page: 2, pageSize: 10);

// Cache key for People based on the passed query string in http requests
// Example function: 
// public IActionResult GetPeople()
// {
//     var queryString = Request.QueryString.Value;
//     return Ok(_personService.GetPeople(queryString));
// }
var cacheKey = CacheConventions.Cachekey<Person>(queryString: queryString);

// Cache key for People based on the passed request body in http requests
// Example function: 
// public IActionResult GetPeople()
// {
//     string rawRequestBody = await Request.Content.ReadAsStringAsync();    
//     return Ok(_personService.GetPeople(rawRequestBody));
// }
var cacheKey = CacheConventions.Cachekey<Person>(raw: requestBody);

// Cache key for People based on ActionExecutingContext or ActionExecutedContext
// This is used inside Action filters
var cacheKey = CacheConventions.Cachekey<Person>(context);

What does ICacheService have for us

Now we have the caceh key. With the help of AuxiliaryLibraries.CacheManager we have a easy access to cashing our data here. Let's dive into caching a little bit deeper.

public class PersonService : IPersonService
{
    private readonly ICacheService _cacheService;
    public async Task Caching()
    {
        // Removing value of the cacheKey
        _cacheService.Remove(cacheKey);
        await _cacheService.RemoveAsync(cacheKey);
        _cacheService.RemoveByPattern(cacheKey);
        await _cacheService.RemoveByPatternAsync(cacheKey);

        // Erease everything we have in our Redis
        _cacheService.FlushDatabase();
        await _cacheService.FlushDatabaseAsync();

        
        // Caching an object
        var _absoluteExpiration = DateTime.Now.AddHours(1);
        var _slidingExpiration = DateTime.Now.AddMinutes(10);
        _cacheService.Set<Person>(cacheKey, person);
        
        // The AbsoluteExpiration and SlidingExpirationis are setting up based on the configuration you set on appsettings.json. But you can 
        // change either of them for any reason.
        await _cacheService.SetAsync<Person>(cacheKey, person, absoluteExpiration: _absoluteExpiration, slidingExpiration: _slidingExpiration);
        _cacheService.Set<Person>(cacheKey, person, absoluteExpiration: _absoluteExpiration, slidingExpiration: _slidingExpiration);
        
        // Try to get a value from cache
        if (_cacheService.TryGet<Person>(cacheKey, out var person))
        {
            person.ToString();
        }

        // Getting a cached data
        var person = _cacheService.Get(cacheKey);
        var person = await _cacheService.GetAsync(cacheKey);
    }
}

Configuration

Now what we do for the last part is the Configuration. The onlt thing here left to do is to call use caching function in Startup.cs file.

service.UseCache(configuration);
//add this to appsettings.json
"CacheConfiguration": {
 "AbsoluteExpirationInHours": 1,
 "SlidingExpirationInMinutes": 30,
 "Host": "111.111.111.111",
 "Port": "80",
 "Password": "redis",
 "DatabaseID": 1
}
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on AuxiliaryLibraries.CacheManager:

Package Downloads
AuxiliaryLibraries.GenericRepository.Core

Generic Repository and Unit of Work Pattern including Cache Handling. With the help of this library you implement your projects faster. You can get rid of implementing CRUD operations for all of your entities and focus on implementing logic of your projec.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.7 142 4/2/2024
1.0.6 110 4/2/2024
1.0.5 368 2/18/2023
1.0.4 249 2/9/2023
1.0.3 305 2/6/2023
1.0.2 372 2/5/2023
1.0.1 342 2/2/2023
1.0.0 382 1/30/2023