{"id":24549492,"url":"https://github.com/waelson/memory-storage","last_synced_at":"2026-05-18T18:39:52.555Z","repository":{"id":272520996,"uuid":"916877272","full_name":"Waelson/memory-storage","owner":"Waelson","description":"Implementação de um storage em memória com funcionalidades semelhantes ao Redis, incluindo suporte ao protocolo RESP (Redis Serialization Protocol) para integração com clientes e bibliotecas Redis padrão.","archived":false,"fork":false,"pushed_at":"2025-01-16T21:05:24.000Z","size":46,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-23T00:15:59.200Z","etag":null,"topics":["golang","redis","storage"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Waelson.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-14T23:28:42.000Z","updated_at":"2025-01-16T21:05:25.000Z","dependencies_parsed_at":"2025-01-15T00:30:56.546Z","dependency_job_id":"8aad1e19-5780-4b9b-a621-d5f6de79ac4c","html_url":"https://github.com/Waelson/memory-storage","commit_stats":null,"previous_names":["waelson/memory-storage"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Waelson%2Fmemory-storage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Waelson%2Fmemory-storage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Waelson%2Fmemory-storage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Waelson%2Fmemory-storage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Waelson","download_url":"https://codeload.github.com/Waelson/memory-storage/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243869585,"owners_count":20361039,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["golang","redis","storage"],"created_at":"2025-01-23T00:16:05.147Z","updated_at":"2026-05-18T18:39:47.517Z","avatar_url":"https://github.com/Waelson.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# M-Storage \n## Um Redis-like para propósitos educacionais\n![Console](documentation/console.png)\n\nM-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).\n\n⚠️ **Nota:** Este projeto é para fins educacionais e não deve ser usado em produção.\n\n---\n\n## 🚀 Funcionalidades\n\n- **Protocolo RESP**: Compatível com clientes Redis para comandos básicos.\n- **Suporte a conexões seguras e não seguras**: Habilite TLS para maior segurança.\n- **Persistência**: Dados armazenados em disco usando memória mapeada.\n- **TTL e Expiração**: Controle de tempo de vida das chaves.\n- **Comandos Redis-like**: Implementação de comandos como `PING`, `SET`, `GET`, `DEL`, entre outros.\n\n---\n\n## 📖 Comandos suportados\n\n### `PING`\n- **Descrição**: Testa a conectividade com o servidor.\n- **Uso**:\n  ```plaintext\n  PING\n  ```\n- **Resposta**:\n    - `+PONG` se bem-sucedido.\n    - Retorna um argumento opcional, se fornecido:\n      ```plaintext\n      PING \"Hello\"\n      +Hello\n      ```\n\n---\n\n### `SET`\n- **Descrição**: Armazena uma chave com um valor e um tempo de expiração.\n- **Uso**:\n  ```plaintext\n  SET key value ttl\n  ```\n- **Parâmetros**:\n    - `key`: A chave para armazenar o valor.\n    - `value`: O valor a ser armazenado.\n    - `ttl`: Tempo de expiração em segundos.\n- **Resposta**:\n    - `+OK` se bem-sucedido.\n\n---\n\n### `GET`\n- **Descrição**: Recupera o valor de uma chave.\n- **Uso**:\n  ```plaintext\n  GET key\n  ```\n- **Resposta**:\n    - O valor associado à chave ou `$-1` se não encontrado.\n\n---\n\n### `DEL`\n- **Descrição**: Remove uma chave do armazenamento.\n- **Uso**:\n  ```plaintext\n  DEL key\n  ```\n- **Resposta**:\n    - `:1` se a chave foi removida.\n    - `:0` se a chave não existe.\n\n---\n\n### `EXISTS`\n- **Descrição**: Verifica se uma chave existe.\n- **Uso**:\n  ```plaintext\n  EXISTS key\n  ```\n- **Resposta**:\n    - `:1` se a chave existe.\n    - `:0` se não existe.\n\n---\n\n### `EXPIRE`\n- **Descrição**: Define um tempo de expiração (em segundos) para uma chave existente.\n- **Uso**:\n  ```plaintext\n  EXPIRE key ttl\n  ```\n- **Resposta**:\n    - `:1` se a operação foi bem-sucedida.\n    - `:0` se a chave não existe.\n\n---\n\n### `TTL`\n- **Descrição**: Retorna o tempo restante antes da expiração de uma chave.\n- **Uso**:\n  ```plaintext\n  TTL key\n  ```\n- **Resposta**:\n    - O tempo restante em segundos (`:N`).\n    - `:-1` se a chave não tem expiração.\n    - `:-2` se a chave não existe ou está expirada.\n\n---\n\n### `FLUSHALL`\n- **Descrição**: Remove todas as chaves do armazenamento.\n- **Uso**:\n  ```plaintext\n  FLUSHALL\n  ```\n- **Resposta**:\n    - `+OK` se bem-sucedido.\n\n---\n\n### `INFO`\n- **Descrição**: Exibe informações sobre o estado do servidor.\n- **Uso**:\n  ```plaintext\n  INFO\n  ```\n- **Resposta**:\n    - Informações detalhadas sobre uptime, número de chaves e uso de memória, no formato:\n      ```plaintext\n      # Server\n      uptime_in_seconds:\u003ctempo\u003e\n  \n      # Stats\n      number_of_keys:\u003cnúmero\u003e\n  \n      # Memory\n      used_memory:\u003cuso\u003e\n\n\n\n## 📂 Estrutura de diretórios\n```\nm-storage/\n├── cmd/\n│   └── main.go                # Ponto de entrada da aplicação\n├── internal/\n│   ├── resp/\n│   │   ├── handler.go         # Gerencia as requisições RESP\n│   │   ├── ping.go            # Implementação do comando PING\n│   │   ├── set.go             # Implementação do comando SET\n│   │   ├── get.go             # Implementação do comando GET\n│   │   ├── del.go             # Implementação do comando DEL\n│   │   ├── exists.go          # Implementação do comando EXISTS\n│   │   ├── expire.go          # Implementação do comando EXPIRE\n│   │   ├── ttl.go             # Implementação do comando TTL\n│   │   ├── flushall.go        # Implementação do comando FLUSHALL\n│   │   ├── info.go            # Implementação do comando INFO\n│   ├── server/\n│   │   ├── server.go          # Lógica principal do servidor\n│   │   ├── storage.go         # Persistência de dados\n├── certs/                     # Diretório para certificados TLS\n│   ├── ca.crt                 # Certificado da Autoridade Certificadora\n│   ├── server.crt             # Certificado público do servidor\n│   ├── server.key             # Chave privada do servidor\n├── go.mod                     # Arquivo de configuração do módulo Go\n├── go.sum                     # Dependências do projeto\n├── README.md                  # Documentação do projeto\n\n```\n\n## 🛠️ Como rodar o projeto\n1. Clone o repositório:\n```bash\ngit clone https://github.com/seu-usuario/m-storage.git\ncd m-storage\n```\n\n2. Instale as dependências:\n```bash\ngo mod tidy\n```\n\n3. Execute o servidor:\n```bash\ngo run cmd/main.go\n```\n\n4. Conecte-se ao servidor usando `redis-cli` ou ferramentas compatíveis:\n```bash\nredis-cli -p 6379\n```\n\n## ⚙️ Configuração TLS (Opcional)\nPara habilitar conexões seguras com TLS:\n1. Gere certificados TLS e coloque-os no diretório `certs/.\n2. Execute o servidor com a flag --tls`.\n```bash\ngo run cmd/main.go --tls --cert=certs/server.crt --key=certs/server.key --ca=certs/ca.crt \n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwaelson%2Fmemory-storage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwaelson%2Fmemory-storage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwaelson%2Fmemory-storage/lists"}