MemorustServidor in-memory minimalista e legível, em Rust

Um banco de dados in-memory leve, feito para ser lido.

O Memorust é um servidor key-value in-memory de binário único, escrito em Rust com Tokio. Ele fala o protocolo RESP, então funciona com o redis-cli e clientes Redis existentes, mantendo o código pequeno e legível.

Rodando em segundos

Clone, compile e conecte com qualquer cliente Redis.

git clone https://github.com/robertolima-dev/memorust.git
cd memorust
cargo run        # starts the server on 127.0.0.1:6379

# in another terminal
redis-cli -p 6379
> SET name Roberto
> GET name

O que ele faz

Um subconjunto focado do Redis, implementado do zero com a legibilidade como objetivo.

Protocolo RESP

Fala o Redis Serialization Protocol, então o redis-cli e clientes Redis existentes se conectam sem mudanças.

Servidor TCP assíncrono

Construído sobre o Tokio, com suporte a múltiplos clientes e leituras concorrentes sob um lock compartilhado.

TTL e expiração

SETEX, EXPIRE e TTL com um limpador em segundo plano que recupera chaves expiradas.

Persistência AOF

Append Only File com escritor bufferizado, fsync periódico (~1s) e replay na inicialização.

Rewrite do AOF

Compacta o log com AOFREWRITE para manter o histórico em disco pequeno.

Binário único, uma dependência

Rust edition 2024 com o Tokio como única dependência. Fácil de compilar, ler e modificar.

Rápido onde importa

redis-benchmark em build de release, máquina de desenvolvimento Apple série M.

OperaçãoSem pipeline (-P 1)Com pipeline (-P 16)
SET~142k ops/seg~264k ops/seg
GET~163k ops/seg~1,27M ops/seg

Sem pipelining o benchmark é dominado pelos round-trips de rede. Com pipelining aparece o teto do servidor: as leituras escalam muito além das escritas porque o GET roda concorrente sob um lock compartilhado.

Comandos suportados

Um subconjunto crescente do conjunto de comandos do Redis.

Conexão

  • PING

Chave / Valor

  • SET
  • GET
  • DEL
  • EXISTS

Expiração

  • SETEX
  • EXPIRE
  • TTL

Administração

  • INFO
  • FLUSHALL
  • AOFREWRITE

Roadmap

Para onde o Memorust está indo.

  • ✓Servidor TCP e protocolo RESP
  • ✓Compatibilidade com redis-cli
  • ✓TTL e limpador em segundo plano
  • ✓AOF, replay e rewrite
  • ✓Escritor AOF bufferizado (appendfsync everysec)
  • ·Escritor AOF assíncrono
  • ·Tipos de valor (Integer, JSON, List)
  • ·Config.toml
  • ·Políticas de evicção de memória
  • ·Snapshot binário (.db)
  • ·Replicação
  • ·Modo cluster

Participe do projeto

O Memorust é open source e contribuições são muito bem-vindas, de correções de digitação a novos comandos.

Contribuir

Veja o fluxo de desenvolvimento, as verificações exigidas e como abrir um pull request.

Guia de contribuição →

Issues e ideias

Encontrou um bug ou quer discutir uma funcionalidade? Abra uma issue no GitHub.

Abrir uma issue →

Código de Conduta

Ao participar deste projeto você concorda em seguir nosso Código de Conduta.

Ler o Código de Conduta →