Cliente Redis para TypeScript: ioredis y redis (node-redis)
\n\nEn el mundo de las aplicaciones web modernas y los microservicios, Redis es uno de los almacenes de datos en memoria más populares. Se utiliza para almacenamiento en caché, gestión de sesiones, colas de tareas, Pub/Sub y mucho más. Si desarrollas en TypeScript, necesitarás un cliente confiable para interactuar con Redis. En este artículo, analizaremos dos opciones principales: ioredis y redis (también conocido como node-redis). Ambas bibliotecas tienen un excelente soporte para TypeScript, se mantienen activamente y ofrecen una amplia gama de funcionalidades.
\n\n¿Por qué necesitas un cliente Redis para TypeScript?
\nTypeScript agrega tipado estático a JavaScript, lo que hace que el código sea más predecible y reduce la cantidad de errores en la etapa de desarrollo. Un cliente Redis para TypeScript te permite:
\n- \n
- Trabajar con comandos de Redis con soporte completo de tipos. \n
- Usar autocompletado en el IDE (IntelliSense). \n
- Integrarse fácilmente con frameworks modernos (NestJS, Express, Koa). \n
- Simplificar el manejo de errores y las reconexiones. \n
Biblioteca ioredis
\nioredis es un cliente Redis con todas las funciones que durante mucho tiempo fue el estándar de facto en el ecosistema Node.js. Admite clustering, Pub/Sub, canalización (pipelining), transacciones (MULTI/EXEC), reconexión automática y mucho más. ioredis está escrito en TypeScript y proporciona tipos listos para usar.
\n\nInstalación
\nnpm install ioredis\nnpm install @types/ioredis # si usas TypeScript < 4.0\n\nEjemplo de conexión y operaciones básicas
\nimport Redis from 'ioredis';\n\n// Crear una conexión a Redis (por defecto localhost:6379)\nconst redis = new Redis();\n\n// Función asíncrona para demostración\nasync function demo() {\n try {\n // Establecer un valor\n await redis.set('user:1:name', 'Ana');\n await redis.set('user:1:age', 30);\n\n // Obtener un valor\n const name = await redis.get('user:1:name');\n console.log('Nombre de usuario:', name);\n\n // Trabajar con hashes\n await redis.hset('user:2', 'name', 'Juan', 'age', 25);\n const user2 = await redis.hgetall('user:2');\n console.log('Usuario 2:', user2);\n\n // Incremento\n const views = await redis.incr('page:home:views');\n console.log('Vistas de página:', views);\n\n // Establecer con tiempo de expiración (TTL)\n await redis.setex('temp:code', 60, '123456');\n const ttl = await redis.ttl('temp:code');\n console.log('Tiempo de vida restante de la clave:', ttl, 'seg');\n\n } catch (error) {\n console.error('Error de Redis:', error);\n } finally {\n // Cerrar la conexión\n redis.disconnect();\n }\n}\n\ndemo();\n\nSoporte para clústeres y Pub/Sub
\nioredis funciona muy bien con clústeres de Redis. Para ello se utiliza la clase especial Cluster:
import Redis from 'ioredis';\n\nconst cluster = new Redis.Cluster([\n { host: '127.0.0.1', port: 7000 },\n { host: '127.0.0.1', port: 7001 },\n { host: '127.0.0.1', port: 7002 }\n]);\n\nawait cluster.set('foo', 'bar');\nconst value = await cluster.get('foo');\nconsole.log(value); // 'bar'\n\nPara Pub/Sub se utiliza una conexión separada, ya que el suscriptor no puede ejecutar comandos normales:
\nimport Redis from 'ioredis';\n\nconst subscriber = new Redis();\nconst publisher = new Redis();\n\nsubscriber.subscribe('news', (err, count) => {\n console.log(`Suscrito a ${count} canal(es)`);\n});\n\nsubscriber.on('message', (channel, message) => {\n console.log(`Mensaje recibido del canal ${channel}: ${message}`);\n});\n\n// Publicar un mensaje\npublisher.publish('news', '¡Hola desde TypeScript!');\n\nBiblioteca redis (node-redis)
\nredis (paquete redis en n