Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

APIs assíncronas do Redis


Todos os gerentes de cliente Redis implementam IRedisClientsManager e IRedisClientsManagerAsync para que os registros do IOC permaneçam os mesmos, o que pode continuar a ser registrado no IRedisClientsManager existente interface, por exemplo:
container.Register<IRedisClientsManager>(c => 
    new RedisManagerPool(redisConnectionString));

Onde pode ser usado para resolver a sincronização IRedisClient e assíncrono IRedisClientAsync clientes, por exemplo:
using var syncRedis = container.Resolve<IRedisClientsManager>().GetClient();
await using var asyncRedis = await container.Resolve<IRedisClientsManager>().GetClientAsync();

Se você deseja forçar o uso da API somente assíncrona, pode optar por apenas registrar IRedisClientsManagerAsync onde ele só permite que você resolva apenas assíncronas IRedisClientAsync e ICacheClientAsync clientes, por exemplo:
public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IRedisClientsManagerAsync>(c => new RedisManagerPool());
}

//... 

public class MyDep
{
    private IRedisClientsManagerAsync manager;
    public MyDep(IRedisClientsManagerAsync manager) => this.manager = manager;

    public async Task<long> Incr(string key, uint value)
    {
        await using var redis = await manager.GetClientAsync();
        return await redis.IncrementAsync(key, value);
    }
}

Uso no ServiceStack #


Dentro dos Serviços e Controladores do ServiceStack, recomendamos o uso de GetRedisAsync() para resolver um IRedisClientAsync :
public class MyService : Service
{
    public async Task<object> Any(MyRequest request)
    {
        await using var redis = await GetRedisAsync();
        await redis.IncrementAsync(nameof(MyRequest), 1);
    }
}

public class HomeController : ServiceStackController
{
    public async Task<ActionResult> Index()
    {
        await using var redis = await GetRedisAsync();
        await redis.IncrementAsync(nameof(HomeController), 1);
    }
}