An open API service indexing awesome lists of open source software.

https://github.com/coderanchel/goredislite

GoRedisLite es una implementación minimalista de un motor de almacenamiento en memoria inspirado en Redis, escrito desde cero en Go. Este proyecto tiene como objetivo estudiar, aprender y replicar los fundamentos de Redis: protocolo propio, manejo en memoria, estructuras básicas y alto rendimiento con TCP nativo.
https://github.com/coderanchel/goredislite

Last synced: 10 months ago
JSON representation

GoRedisLite es una implementación minimalista de un motor de almacenamiento en memoria inspirado en Redis, escrito desde cero en Go. Este proyecto tiene como objetivo estudiar, aprender y replicar los fundamentos de Redis: protocolo propio, manejo en memoria, estructuras básicas y alto rendimiento con TCP nativo.

Awesome Lists containing this project

README

          

# 🚀 GoRedisLite
[![Go Report Card](https://goreportcard.com/badge/github.com/CoderAnchel/GoRedisLite)](https://goreportcard.com/report/github.com/CoderAnchel/GoRedisLite)
[![License](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg)](LICENSE.md)
[![Go Version](https://img.shields.io/badge/Go-1.20%2B-brightgreen)](go.mod)

![Logo](DOCS/assets/Group%2076.svg)

GoRedisLite es una implementación completa de un motor de almacenamiento en memoria, inspirado en Redis y escrita desde cero en Go. Replica fundamentos como protocolo propio, manejo en memoria, estructuras complejas, autenticación de usuarios, expiraciones y persistencia. Es ideal para aprender, experimentar y analizar cómo funciona un sistema tipo Redis.

---

## 🧩 Características principales

- 🔌 **Servidor TCP concurrente** con protocolo propio y parsing de comandos estilo Redis.
- 🔐 **Sistema de usuarios** con autenticación y permisos.
- ⚡️ **Tipos soportados:** strings, enteros, listas de strings/enteros, hashes.
- ⏳ **Expiración de claves** configurable al guardar valores.
- 💾 **Persistencia** en disco usando LevelDB para usuarios, roles y logs.
- 📦 **Respuestas estructuradas en JSON** para integraciones sencillas.
- 🗃️ **Logs de operaciones** y control de auditoría.
- 🧪 **Cobertura de pruebas unitarias**.
- 📜 **Documentación de comandos** en `DOCS/Comandos.md`.

---

## 📚 Comandos soportados

Consulta detalles y ejemplos en [`DOCS/Comandos.md`](DOCS/Comandos.md).

### Claves y valores
- `SET key value [minutos_expiración]`
Guarda un valor de cualquier tipo soportado (string, entero, lista, hash). Puedes agregar un cuarto argumento en minutos para establecer expiración (TTL).
- `GET key`
Recupera el valor asociado a una clave (sea string, entero, lista o hash).
- `DEL key`
Elimina la clave o campo especificado.

### Hashes
- `HSET key field value`
Crea o actualiza un campo de un hash.
- `HGET key field`
Obtiene el valor de un campo específico de un hash.
- `HGETALL key`
Devuelve todos los campos y valores de un hash.

### Listas
- `LPUSH key value`
Inserta un elemento al inicio de una lista.
- `LPOP key`
Elimina y devuelve el primer elemento de una lista.

### Usuarios y seguridad
- `LOGIN usuario contraseña`
Inicia sesión con un usuario registrado.
- `CREATE usuario contraseña`
Crea un nuevo usuario con permisos básicos.
- `CREATEPRED usuario contraseña rol`
Crea un usuario asignándole un rol específico y configuraciones avanzadas (ideal para administración o automatización).

### Utilidades
- `LOGS`
Muestra los logs del sistema.

### Ejemplo – Soporte de enteros y listas de enteros
Puedes guardar y recuperar enteros directamente, así como listas de enteros:
```
SET n 123
GET n
SET numeros [1,2,3]
LPUSH numeros 4
LPOP numeros
HSET usuario:1 edad 25
HGET usuario:1 edad
```

---

## ⏳ Expiración de claves (TTL)

Al usar `SET` puedes agregar como cuarto argumento los minutos de vigencia de la clave. Tras ese tiempo, la clave se elimina automáticamente al intentar acceder a ella.

**Ejemplo:**
```
SET temp_token valor 3
GET temp_token
# tras 3 minutos, GET temp_token devolverá error o vacío
```

---

## 📦 Instalación y uso

### Requisitos

- Go 1.20+
- netcat/telnet o cliente TCP para conectarse

### Ejecutar el servidor

```bash
go run main.go
```
El servidor escucha por defecto en el puerto `6379`.

### Probar comandos

```bash
nc localhost 6379
```
Ejemplo:
```
LOGIN usuario password
SET foo bar 5
GET foo
HSET user:1 name Juan
HGET user:1 name
LPUSH lista valor
LPOP lista
CREATE otro_usuario otra_pass
SET numeros [1,2,3]
LPUSH numeros 4
GET numeros
```

---

## 📁 Estructura del proyecto

```plaintext
GoRedisLite/
├── cmd/ # Ejecutables (servidor principal)
├── internal/ # Lógica de negocio
│ ├── Entities/ # Tipos y estructuras principales
├── Parser/ # Parsing y ejecución de comandos
├── Persistence/ # Persistencia a disco (LevelDB)
├── Security/ # Seguridad, usuarios y roles
├── Utils/ # Utilidades generales
├── tests/ # Pruebas unitarias
├── DOCS/ # Documentación y comandos detallados
└── main.go
```

---

## 🗺️ Roadmap

- [x] Servidor TCP concurrente
- [x] Parser extendido y validación de tipos
- [x] Soporte para strings, enteros, listas, hashes
- [x] Sistema de usuarios y autenticación
- [x] Expiración de claves y TTL
- [x] Persistencia (LevelDB)
- [x] Logs y auditoría
- [ ] SDK Go para integración en proyectos externos (en progreso)
- [ ] Clustering y sharding (en progreso)
- [ ] Parser RESP (compatibilidad total con clientes Redis)
- [ ] Mejoras de rendimiento y benchmarks comparativos

---

## 🤝 Contribuciones

¡Las contribuciones son bienvenidas! Abre un issue, propone una mejora o envía un pull request.

---

## 📝 Licencia

BSD 3-Clause License – consulta el archivo LICENSE.md para más detalles.

---

> _GoRedisLite es un proyecto educativo y experimental. No recomendado para producción._TTL)