RedisNet, production ready Redis client for dotnet core
Tags: csharp, dotnet, webdev, productivity
Published: 2021-05-11 08:26:56

---
title: RedisNet, production ready Redis client for dotnet core
published: true
description: A production ready Redis multi context client with support for traffic compression 
tags: csharp,dotnet,webdev,productivity
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hckoeej8cj5y67eqv6p2.png
---

- Check out the source code from [Github](https://github.com/alicommit-malp/Redis.Net) 

- Download it from [Nuget](https://www.nuget.org/packages/RedisNet/)

```bash
dotnet add package RedisNet
```


- Compression (increase your heavy Redis calls performance by 50%)
```c#
public void ConfigureServices(IServiceCollection services)
{
    var redis2ConfigurationOptions = ConfigurationOptions.Parse("localhost:6379");
    redis2ConfigurationOptions.ReconnectRetryPolicy = new ExponentialRetry(1000);
    services.AddRedisDotNet(new RedisCacheOptions()
    {
        ConfigurationOptions = redis2ConfigurationOptions,
        CompressionOption = new CompressionOption()
        {
            TriggerByteSize = 100 * 1024
        }
    });
}
```
When the value size of a Redis key exceeds 100 Kilo-Bytes it will apply gzip compression algorithm to decrease the size and automatically upon retrieval it will decompress it so the whole process is transparent from the client's perspective. The compression will decrease the size of the data packets through the network therefore the performances of the redis call will increase by 50%.

- Key deletion with regex

# Compression Benchmark Results
``` ini

BenchmarkDotNet=v0.12.1, OS=macOS 11.3 (20E232) [Darwin 20.4.0]
Intel Core i7-9750H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores
.NET Core SDK=5.0.201
  [Host] : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT DEBUG


```
|                      Method |       Mean |    Error |   StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated |
|---------------------------- |-----------:|---------:|---------:|------:|------:|------:|----------:|
|    WithCompressionBenchmark |   668.2 ms | 13.34 ms | 27.24 ms |     - |     - |     - |   4.88 MB |
| WithoutCompressionBenchmark | 1,387.1 ms | 26.92 ms | 37.74 ms |     - |     - |     - |   2.39 MB |

 
# Usage Method 1
Single redis server

Prerequisite
```bash
docker run --name redis1 -d -p 6379:6379  redis redis-server --appendonly yes
```

```c#
public void ConfigureServices(IServiceCollection services)
{
    var redis2ConfigurationOptions = ConfigurationOptions.Parse("localhost:6379");
    redis2ConfigurationOptions.ReconnectRetryPolicy = new ExponentialRetry(1000);
    services.AddRedisDotNet(new RedisCacheOptions()
    {
        ConfigurationOptions = redis2ConfigurationOptions
    });
}

public class TestController : Controller
{
    private readonly IRedisService _redisService;
    public TestController(IRedisService redisService){
        _redisService = redisService;
    }

    public IActionResult Get(string key){
        var result = _redisService.GetString(key);
        return OK(result);
    }

    public async Task<IActionResult> GetAsync(string key){
        var result = await _redisService.GetStringAsync(key);
        return OK(result);
    }
}


```

# Usage Method 2
Multiple Redis servers

Prerequisite
```bash
docker run --name redis1 -d -p 6379:6379  redis redis-server --appendonly yes
docker run --name redis2 -d -p 6380:6380  redis redis-server --appendonly yes
```

```c#
public void ConfigureServices(IServiceCollection services)
{
    var redis1ConfigurationOptions = ConfigurationOptions.Parse("localhost:6379");
    redis1ConfigurationOptions.ReconnectRetryPolicy = new ExponentialRetry(1000);
    services.AddRedisDotNet<Redis1>(new RedisCacheOptions()
    {
       ConfigurationOptions = redis1ConfigurationOptions
    });

    var redis2ConfigurationOptions = ConfigurationOptions.Parse("localhost:6380");
    redis2ConfigurationOptions.ReconnectRetryPolicy = new ExponentialRetry(1000);
    services.AddRedisDotNet<Redis2>(new RedisCacheOptions()
    {
       ConfigurationOptions = redis2ConfigurationOptions
    });
}


public class Redis1 : RedisService<Redis1>
{
    public Redis1(IOptionsMonitor<RedisCacheOptions> cacheOptions) : base(cacheOptions)
    {
    }
}


public class Redis2 : RedisService<Redis2>
{
    public Redis2(IOptionsMonitor<RedisCacheOptions> cacheOptions) : base(cacheOptions)
    {
    }
}

public class Redis1Controller : ControllerBase
{
    private readonly Redis1 _redis1;

    public Redis1Controller(Redis1 redis1)
    {
        _redis1 = redis1;
    }

    [HttpGet]
    public async Task<IActionResult> Get()
    {
        return Ok(await _redis1.GetStringAsync("redis1"));
    }
}


public class Redis2Controller : ControllerBase
{
    private readonly Redis2 _redis2;

    public Redis2Controller(Redis2 redis2)
    {
        _redis2 = redis2;
    }

    [HttpGet]
    public async Task<IActionResult> Get()
    {
        return Ok(await _redis2.GetStringAsync("redis2"));
    }
}


```

- Check out the source code from [Github](https://github.com/alicommit-malp/Redis.Net) 

- Download it from [Nuget](https://www.nuget.org/packages/RedisNet/)

```bash
dotnet add package RedisNet --version 1.1.0
```

Happy coding :)