[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.