Si vienes del mundo de NestJS, amas los decoradores, la inyección de dependencias y el tipado fuerte. Pero cuando toca integrar Redis, a menudo sentimos que retrocedemos 10 años: magic strings, parsers manuales de JSON y comandos low-level que ensucian nuestra lógica de negocio.
Hoy quiero presentarles nestjs-redisom, una librería open-source diseñada para cerrar esa brecha y tratar a Redis con el respeto que se merece en una arquitectura empresarial moderna.
🤔 ¿Por qué creé esto?
Redis ha evolucionado. Ya no es solo un caché key-value. Con Redis Stack (RedisJSON + RediSearch), se ha convertido en una base de datos de documentos en tiempo real increíblemente potente.
Sin embargo, usar estas features desde Node.js suele ser verboso. Redis OM (la librería oficial) ayuda, pero integrarla en NestJS requería mucho boilerplate. nestjs-redisom elimina esa fricción, dándote una experiencia nativa.
Instalación
npm install nestjs-redisom redis-om redis
🛠️ Profundizando en el Código
Veamos ejemplos más realistas de lo que puedes lograr.
1. Modelado de Datos Complejos (Anidados)
No estamos limitados a strings planos. Podemos modelar objetos complejos con validación implícita.
// 1. Definimos una clase anidada
export class Address {
@Prop({ indexed: true })
city: string; // Indexado para buscar "Usuarios en Madrid"
@Prop()
zipCode: string;
}
// 2. Definimos la Entidad Principal
@Schema()
export class UserProfile extends BaseEntity {
@Prop({ textSearch: true })
bio: string;
@Prop({ type: () => Address }) // Mapeo anidado
address: Address;
@Prop()
roles: string[]; // Arrays de strings
}
2. Búsquedas Avanzadas (Fluent API)
Aquí es donde nestjs-redisom brilla. Olvídate de aprender la sintaxis de comandos de RediSearch (FT.SEARCH index "@field:value ..."). Usa esta API fluida y tipada.
"Encuentra usuarios que vivan en 'New York', tengan el rol 'admin' y cuya bio mencione 'typescript'"
const users = await userRepo.search()
.where('address_city').equals('New York') // Busca en objeto anidado
.and('roles').contain('admin') // Busca en Array
.and('bio').matches('typescript') // Full-Text Search
.return.page(0, 10); // Paginación nativa
3. Expiración de Documentos (TTL)
Manejar sesiones o caché temporal es trivial. No necesitas scripts de Lua ni nada por el estilo.
// Crea una sesión y haz que expire en 1 hora
async createSession(user: User) {
const session = await this.sessionRepo.save(user);
await this.sessionRepo.expire(session[this.sessionRepo.schema.idField], 3600);
return session;
}
🎯 Mejores Casos de Uso
- High-Speed Objects: Carritos de compra, Perfiles de Jugador, Sesiones. Datos que lees/escribes 1000 veces por segundo.
-
Caché con "Poderes": A veces necesitas invalidar caché por criterio ("borrar caché de todos los productos de la categoría X"). Con Redis normal es imposible (o lento con
KEYS *). Con RedisOM es una query de O(1) o O(N log N). - Geo-Spatial Features: "Encuentra conductores cerca de mi", usando la potencia nativa de Redis para geo-hashing.
⚠️ Trade-offs (Honestidad ante todo)
- RAM es Dinero: Redis guarda todo en memoria. No uses esto para guardar logs de auditoría de 5 años.
- Eventual Consistency: Los índices de búsqueda se actualizan asíncronamente (milisegundos). No es ACID estricto para búsquedas inmediatas post-escritura.
💌 Agradecimientos Especiales
Este proyecto ha sido construido con muchas horas de dedicación y amor por el código.
Para una chica que siempre me inspira en silencio, y su sola existencia me incentiva a seguir programando en mis tiempos libres, gracias "YLP".
☕ Apoya el Proyecto
Si este proyecto te ha sido útil o te parece interesante, considera apoyarlo:
- ⭐️ Star en GitHub: Es gratis y ayuda a que más gente lo encuentre.
- ☕ Invítame un Café: Si quieres ir un paso más allá, puedes hacerlo en buymeacoffee.com/alpha018.
🔗 Pruébalo y Contribuye
- Repo: github.com/Alpha018/nestjs-redisom
- Autor: dev.to/alpha018
¿Qué opinan? ¿Le darán una oportunidad a Redis como base de datos de documentos? 👇
Top comments (0)