06.06 — lib/redis.ts + Upstash#
Fichier source :
lib/redis.ts
Code#
import { Redis } from "@upstash/redis";
const redis = new Redis({
url: process.env.UPSTASH_REDIS_REST_URL,
token: process.env.UPSTASH_REDIS_REST_TOKEN,
});
export default redis;Pourquoi @upstash/redis plutôt que ioredis#
| Critère | ioredis | @upstash/redis |
|---|---|---|
| Protocole | TCP / RESP | HTTP / REST |
| Edge runtime | ❌ Non | ✅ Oui |
| Connexion | Persistante | Per-request |
| Latence (warm) | < 1ms | 50-100ms |
| Latence (cold) | 200ms+ | 50-100ms |
| Coût | Variable | Pay-per-request |
| Setup | Self-hosted Redis | Upstash dashboard (managed) |
L’Edge runtime n’accepte pas de connexions TCP persistantes (chaque worker est éphémère).
Donc : Upstash REST.
Singleton#
const redis = new Redis({...});
export default redis;L’instance est créée une seule fois à l’import du module (cold start).
Elle est réutilisée pour toutes les requêtes du worker.
Avec un trafic raisonnable, le worker reste warm.
Consommation des variables d’environnement#
url: process.env.UPSTASH_REDIS_REST_URL,
token: process.env.UPSTASH_REDIS_REST_TOKEN,UPSTASH_REDIS_REST_URL = "https://us1-something-12345.upstash.io"
UPSTASH_REDIS_REST_TOKEN = "AcdefGHi..."Le token est un JWT-like généré par Upstash, scopé à une base Redis spécifique.
vercel env add#
Le README détaille :
vercel env add API_SECRET
vercel env add UPSTASH_REDIS_REST_URL
vercel env add UPSTASH_REDIS_REST_TOKEN
vercel deploy→ Trois vercel env add, puis vercel deploy.
Pas de config locale nécessaire.
API#
| Méthode Redis | Endpoint | Usage |
|---|---|---|
redis.set(key, value, { ex: ttl }) | /api/otp | SET avec TTL |
redis.scan(cursor, { match, count }) | /api/otp-history | SCAN cursor-based |
redis.mget(...keys) | /api/otp-history | MGET (Multi-get) |
Gestion des erreurs#
@upstash/redis lève en cas d’erreur réseau ou serveur.
Le code ne catch pas : les erreurs remontent au handler de Vercel, qui répond 500 Internal Server Error.
- Du côté de l’Igoristan : l’utilisateur voit une erreur OTP, peut retry.
- Côté Ocarina :
transient_errorscatch et retry.
Absence de timeout explicite#
const redis = new Redis({
url: ...,
token: ...,
});Pas de timeout configuré. @upstash/redis a un default (typiquement 5s).
L’Edge runtime a son propre timeout (10s par défaut côté Vercel).
Donc même si @upstash/redis ne timeout pas, Vercel coupe la Edge Function.