Client Redis pour TypeScript : ioredis et redis (node-redis)
\n\nDans le monde des applications web modernes et des microservices, Redis est l'un des magasins de données en mémoire les plus populaires. Il est utilisé pour la mise en cache, la gestion des sessions, les files d'attente de tâches, Pub/Sub et bien plus encore. Si vous développez en TypeScript, vous aurez besoin d'un client fiable pour interagir avec Redis. Dans cet article, nous examinerons deux options principales : ioredis et redis (également connu sous le nom de node-redis). Les deux bibliothèques offrent un excellent support TypeScript, sont activement maintenues et fournissent un large éventail de fonctionnalités.
\n\nPourquoi un client Redis pour TypeScript ?
\nTypeScript ajoute un typage statique à JavaScript, rendant le code plus prévisible et réduisant le nombre d'erreurs au stade du développement. Un client Redis pour TypeScript permet :
\n- \n
- De travailler avec les commandes Redis avec une prise en charge complète des types. \n
- D'utiliser l'autocomplétion dans l'IDE (IntelliSense). \n
- De s'intégrer facilement avec les frameworks modernes (NestJS, Express, Koa). \n
- De simplifier la gestion des erreurs et les reconnexions. \n
Bibliothèque ioredis
\nioredis est un client Redis complet qui a longtemps été la norme de facto dans l'écosystème Node.js. Il prend en charge le clustering, Pub/Sub, le pipelining, les transactions (MULTI/EXEC), la reconnexion automatique et bien plus encore. ioredis est écrit en TypeScript et fournit des types prêts à l'emploi.
\n\nInstallation
\nnpm install ioredis\nnpm install @types/ioredis # si vous utilisez TypeScript < 4.0\n\nExemple de connexion et d'opérations de base
\nimport Redis from 'ioredis';\n\n// Création d'une connexion à Redis (par défaut localhost:6379)\nconst redis = new Redis();\n\n// Fonction asynchrone pour la démonstration\nasync function demo() {\n try {\n // Définition d'une valeur\n await redis.set('user:1:name', 'Anna');\n await redis.set('user:1:age', 30);\n\n // Récupération d'une valeur\n const name = await redis.get('user:1:name');\n console.log('Nom d\'utilisateur :', name);\n\n // Travail avec les hachages\n await redis.hset('user:2', 'name', 'Ivan', 'age', 25);\n const user2 = await redis.hgetall('user:2');\n console.log('Utilisateur 2 :', user2);\n\n // Incrémentation\n const views = await redis.incr('page:home:views');\n console.log('Vues de la page :', views);\n\n // Définition avec expiration (TTL)\n await redis.setex('temp:code', 60, '123456');\n const ttl = await redis.ttl('temp:code');\n console.log('Temps de vie restant de la clé :', ttl, 'sec');\n\n } catch (error) {\n console.error('Erreur Redis :', error);\n } finally {\n // Fermeture de la connexion\n redis.disconnect();\n }\n}\n\ndemo();\n\nPrise en charge des clusters et Pub/Sub
\nioredis fonctionne parfaitement avec les clusters Redis. Pour cela, on utilise la classe spéciale 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\nPour Pub/Sub, une connexion séparée est utilisée, car un abonné ne peut pas exécuter de commandes normales :
\nimport Redis from 'ioredis';\n\nconst subscriber = new Redis();\nconst publisher = new Redis();\n\nsubscriber.subscribe('news', (err, count) => {\n console.log(`Abonné à ${count} canal(aux)`);\n});\n\nsubscriber.on('message', (channel, message) => {\n console.log(`Message reçu du canal ${channel} : ${message}`);\n});\n\n// Publication d'un message\npublisher.publish('news', 'Bonjour depuis TypeScript !');\n\nBibliothèque redis (node-redis)
\nredis (paquet redis sur n