M-Storage é um servidor Redis-like desenvolvido com Golang. Este projeto foi criado com o objetivo de aprendizado e exploração das funcionalidades básicas do Redis, incluindo comandos como PING
, SET
, GET
, DEL
, entre outros. Embora não seja uma implementação completa do Redis, ele suporta muitas de suas operações fundamentais e segue o protocolo RESP (Redis Serialization Protocol).
- Protocolo RESP: Compatível com clientes Redis para comandos básicos.
- Suporte a conexões seguras e não seguras: Habilite TLS para maior segurança.
- Persistência: Dados armazenados em disco usando memória mapeada.
- TTL e Expiração: Controle de tempo de vida das chaves.
- Comandos Redis-like: Implementação de comandos como
PING
,SET
,GET
,DEL
, entre outros.
- Descrição: Testa a conectividade com o servidor.
- Uso:
PING
- Resposta:
+PONG
se bem-sucedido.- Retorna um argumento opcional, se fornecido:
PING "Hello" +Hello
- Descrição: Armazena uma chave com um valor e um tempo de expiração.
- Uso:
SET key value ttl
- Parâmetros:
key
: A chave para armazenar o valor.value
: O valor a ser armazenado.ttl
: Tempo de expiração em segundos.
- Resposta:
+OK
se bem-sucedido.
- Descrição: Recupera o valor de uma chave.
- Uso:
GET key
- Resposta:
- O valor associado à chave ou
$-1
se não encontrado.
- O valor associado à chave ou
- Descrição: Remove uma chave do armazenamento.
- Uso:
DEL key
- Resposta:
:1
se a chave foi removida.:0
se a chave não existe.
- Descrição: Verifica se uma chave existe.
- Uso:
EXISTS key
- Resposta:
:1
se a chave existe.:0
se não existe.
- Descrição: Define um tempo de expiração (em segundos) para uma chave existente.
- Uso:
EXPIRE key ttl
- Resposta:
:1
se a operação foi bem-sucedida.:0
se a chave não existe.
- Descrição: Retorna o tempo restante antes da expiração de uma chave.
- Uso:
TTL key
- Resposta:
- O tempo restante em segundos (
:N
). :-1
se a chave não tem expiração.:-2
se a chave não existe ou está expirada.
- O tempo restante em segundos (
- Descrição: Remove todas as chaves do armazenamento.
- Uso:
FLUSHALL
- Resposta:
+OK
se bem-sucedido.
- Descrição: Exibe informações sobre o estado do servidor.
- Uso:
INFO
- Resposta:
- Informações detalhadas sobre uptime, número de chaves e uso de memória, no formato:
# Server uptime_in_seconds:<tempo> # Stats number_of_keys:<número> # Memory used_memory:<uso>
- Informações detalhadas sobre uptime, número de chaves e uso de memória, no formato:
m-storage/
├── cmd/
│ └── main.go # Ponto de entrada da aplicação
├── internal/
│ ├── resp/
│ │ ├── handler.go # Gerencia as requisições RESP
│ │ ├── ping.go # Implementação do comando PING
│ │ ├── set.go # Implementação do comando SET
│ │ ├── get.go # Implementação do comando GET
│ │ ├── del.go # Implementação do comando DEL
│ │ ├── exists.go # Implementação do comando EXISTS
│ │ ├── expire.go # Implementação do comando EXPIRE
│ │ ├── ttl.go # Implementação do comando TTL
│ │ ├── flushall.go # Implementação do comando FLUSHALL
│ │ ├── info.go # Implementação do comando INFO
│ ├── server/
│ │ ├── server.go # Lógica principal do servidor
│ │ ├── storage.go # Persistência de dados
├── certs/ # Diretório para certificados TLS
│ ├── ca.crt # Certificado da Autoridade Certificadora
│ ├── server.crt # Certificado público do servidor
│ ├── server.key # Chave privada do servidor
├── go.mod # Arquivo de configuração do módulo Go
├── go.sum # Dependências do projeto
├── README.md # Documentação do projeto
- Clone o repositório:
git clone https://github.com/seu-usuario/m-storage.git
cd m-storage
- Instale as dependências:
go mod tidy
- Execute o servidor:
go run cmd/main.go
- Conecte-se ao servidor usando
redis-cli
ou ferramentas compatíveis:
redis-cli -p 6379
Para habilitar conexões seguras com TLS:
- Gere certificados TLS e coloque-os no diretório `certs/.
- Execute o servidor com a flag --tls`.
go run cmd/main.go --tls --cert=certs/server.crt --key=certs/server.key --ca=certs/ca.crt