DashMap para Rust: Guia Completo da Hash Table Concorrente
1. O que é e para que serve
DashMap é uma hash map concorrente (concurrent) de alto desempenho para a linguagem Rust, projetada para uso em aplicações multi-thread. Na biblioteca padrão do Rust existe o HashMap, mas ele não é thread-safe. Se você tentar usar HashMap a partir de várias threads sem sincronização externa (como Mutex ou RwLock), o compilador do Rust emitirá um erro. O DashMap resolve esse problema fornecendo uma estrutura de dados pronta que pode ser usada com segurança simultaneamente por várias threads, sem a necessidade de envolvê-la manualmente em locks.
Por que isso é necessário? Em aplicações multi-thread modernas, é comum precisar de um estado compartilhado acessado por várias threads. Um exemplo clássico é um cache, um servidor web processando requisições em um pool de threads, ou um banco de dados in-memory. Usar Mutex<HashMap> pode se tornar um gargalo (bottleneck), pois o Mutex bloqueia todo o mapa, mesmo que diferentes threads estejam trabalhando com chaves diferentes. O DashMap utiliza a técnica de "sharding": a hash table interna é dividida em vários segmentos independentes (shards), cada um protegido por seu próprio RwLock. Isso permite operações simultâneas de leitura e escrita em diferentes segmentos sem bloqueio mútuo, proporcionando um ganho significativo de desempenho em processadores multi-core.
O DashMap não é apenas um wrapper thread-safe. Ele oferece uma API rica, incluindo iteradores, operações condicionais (compare-and-swap), inserção com retorno, e muito mais. Foi projetado para ser o mais ergonômico e intuitivo possível para desenvolvedores acostumados com o HashMap padrão. É uma das bibliotecas mais populares e maduras do ecossistema Rust para trabalhar com dados concorrentes.
2. Instalação
Para adicionar o DashMap ao seu projeto Rust, use o gerenciador de pacotes cargo. Execute o seguinte comando no diretório raiz do seu projeto:
cargo add dashmap
Este comando adicionará a versão mais recente da biblioteca ao seu arquivo Cargo.toml. Se preferir fazer isso manualmente, adicione a seguinte linha na seção [dependencies]:
[dependencies]
dashmap = "6.1"
No momento da escrita deste artigo, a versão estável mais recente é a 6.1. Recomenda-se usar a versão atual, pois a biblioteca está em desenvolvimento ativo.
3. Início Rápido
Abaixo está um exemplo mínimo funcional demonstrando a criação de um DashMap, inserção, leitura e remoção de dados.
use dashmap::DashMap;
fn main() {
// Cria um novo hash map vazio
let map = DashMap::new();
// Insere pares chave-valor
map.insert("chave1", 10);
map.insert("chave2", 20);
// Lê o valor de uma chave
if let Some(valor) = map.get("chave1") {
println!("Valor para 'chave1': {}", *valor);
}
// Atualiza um valor
map.insert("chave1", 100);
// Remove um elemento
map.remove("chave2");
// Verifica o tamanho
println!("Número de elementos: {}", map.len());
}
Este exemplo compila e executa sem quaisquer locks adicionais, o que é uma vantagem chave do DashMap.
4. Métodos Principais
Vamos explorar 8 métodos essenciais do DashMap. Todos os exemplos assumem use dash