[PT-BR] Deletando chaves de maneira eficiente utilizando regex no .NET

Abordagem Tradicional: As Desvantagens da Exclusão de Chaves uma por uma

Ao trabalhar com Redis, você pode usar um método como o seguinte para excluir chaves:


public class CacheManager {

     private readonly IDistributedCache _cache;
     public CacheManager(IDDistributedCache cache) {
         _cache = cache;
     }

     public async Task RemoveKeys() {
         await Cache.RemoveAsync("key-1");
         await Cache.RemoveAsync("key-2");
         await Cache.RemoveAsync("key-3");
     }
}

O único problema com essa abordagem é que realizamos uma ida e volta para cada exclusão de chave, ou seja, chamamos o servidor Redis a cada exclusão. Em momentos em que a latência é importante e o número de chaves é grande, isso pode fazer uma grande diferença. E se pudéssemos excluir várias chaves de uma vez?

Solução Otimizada: Usando Regex Patterns para Exclusão em Massa

A primeira mudança necessária é usar um IConnectionMultiplexer, pois precisaremos executar scripts diretamente na instância do Redis. Em seguida, execute um script Lua, que será o seguinte:

for i, name in ipairs(redis.call('KEYS', @prefix)) doredis.call('DEL', name); end

Implementando a Solução: Aproveitando IConnectionMultiplexer e Scripts Lua

Voltando ao código, acabaríamos com algo assim:

public class CacheManager
{
     private readonly IConnectionMultiplexer _multiplexer;
     public CacheManager(IConnectionMultiplexer multiplexer)
     {
         _multiplexer = multiplexer;
     }

     public async Task RemoveKeys(string prefix)
     {
         var prepared = LuaScript.Prepare("for i, name in ipairs(redis.call('KEYS', @prefix)) do redis.call('DEL', name); end");
         await _multiplexer.GetDatabase().ScriptEvaluateAsync(prepared, new { prefix = prefix });
     }

}

// Then, we use it like this:
...
await manager.RemoveKeys("key-*");

Conclusão: Melhorando o Desempenho com Gerenciamento Eficiente de Chaves

Concluindo, excluir eficientemente várias chaves Redis por padrão em uma aplicação .NET pode reduzir significativamente a latência e melhorar o desempenho. Aproveitando o IConnectionMultiplexer e executando um script Lua diretamente na instância do Redis, você pode simplificar o processo de exclusão e evitar a sobrecarga de vários round-trips para a instância.