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èreioredis@upstash/redis
ProtocoleTCP / RESPHTTP / REST
Edge runtime❌ Non✅ Oui
ConnexionPersistantePer-request
Latence (warm)< 1ms50-100ms
Latence (cold)200ms+50-100ms
CoûtVariablePay-per-request
SetupSelf-hosted RedisUpstash 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 RedisEndpointUsage
redis.set(key, value, { ex: ttl })/api/otpSET avec TTL
redis.scan(cursor, { match, count })/api/otp-historySCAN cursor-based
redis.mget(...keys)/api/otp-historyMGET (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.

  1. Du côté de l’Igoristan : l’utilisateur voit une erreur OTP, peut retry.
  2. Côté Ocarina : transient_errors catch 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.