# [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:

```csharp

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`](http://redis.call)`('KEYS', @prefix)) do`[`redis.call`](http://redis.call)`('DEL', name); end`

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

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

```csharp
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.

## Links relevantes

* [https://stackexchange.github.io/StackExchange.Redis/Scripting](https://stackexchange.github.io/StackExchange.Redis/Scripting)
    
* [https://stackoverflow.com/a/27561399/12881014](https://stackoverflow.com/a/27561399/12881014)
