UM EXPERIMENTO EM RUST

Pequeno por escolha.
Feito para aprender.

Um banco de dados em memória inspirado no Redis. Explore redes, concorrência e persistência em uma base de código que você consegue entender.

Rust + TokioOpen sourceMIT / Apache-2.0
memorust — redis-cli

# Uma conversa com o Memorust

$ redis-cli -p 6379

127.0.0.1:6379 > SET name Roberto

OK

127.0.0.1:6379 > GET name

"Roberto"

127.0.0.1:6379 > PING

PONG

01 / SET. GET. Entenda.
In-memory key-valueRESP protocolTTLAOF persistence

OS FUNDAMENTOS, NA PRÁTICA

O que ele faz

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

01

Protocolo RESP

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

02

Servidor TCP assíncrono

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

03

TTL e expiração

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

04

Persistência AOF

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

05

Rewrite do AOF

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

06

Binário único, uma dependência

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

PRIMEIROS PASSOS

Comece pelo terminal

Clone, compile e conecte com qualquer cliente Redis.

Rust 1.85+ · redis-cli para conectar

Ler a documentação
Terminal
git clone https://github.com/robertolima-dev/memorust.git
cd memorust
cargo run

# Em outro terminal

redis-cli -p 6379

MEDIR TAMBÉM É APRENDER

Rápido onde importa

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

GET · PIPELINE 16~1,27M

operações por segundo

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

Resultados de referência; variam conforme o ambiente.

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.

REFERÊNCIA DE COMANDOS

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

EM DESENVOLVIMENTO

Roadmap

Para onde o Memorust está indo.

Abrir uma issue

Implementado

  • Servidor TCP e protocolo RESP
  • Compatibilidade com redis-cli
  • TTL e limpador em segundo plano
  • AOF, replay e rewrite
  • Escritor AOF bufferizado (appendfsync everysec)

Próximos passos

  • 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