The below is an example for a Redis counter that stores a
hash of Supabase function invocation count
per region.
Redis database setup
Create a Redis database using the
Upstash Console or
Upstash CLI.
Select the Global
type to minimize the latency from all edge locations. Copy
the UPSTASH_REDIS_REST_URL
and UPSTASH_REDIS_REST_TOKEN
to your .env file.
You’ll find them under Details > REST API > .env.
cp supabase/functions/upstash-redis-counter/.env.example supabase/functions/upstash-redis-counter/.env
Code
Make sure you have the latest version of the
Supabase CLI installed.
Create a new function in your project:
supabase functions new upstash-redis-counter
And add the code to the index.ts
file:
import { serve } from "https://deno.land/std@0.177.0/http/server.ts";
import { Redis } from "https://deno.land/x/upstash_redis@v1.19.3/mod.ts";
console.log(`Function "upstash-redis-counter" up and running!`);
serve(async (_req) => {
try {
const redis = new Redis({
url: Deno.env.get("UPSTASH_REDIS_REST_URL")!,
token: Deno.env.get("UPSTASH_REDIS_REST_TOKEN")!,
});
const deno_region = Deno.env.get("DENO_REGION");
if (deno_region) {
await redis.hincrby("supa-edge-counter", deno_region, 1);
} else {
await redis.hincrby("supa-edge-counter", "localhost", 1);
}
const counterHash: Record<string, number> | null = await redis.hgetall(
"supa-edge-counter"
);
const counters = Object.entries(counterHash!)
.sort(([, a], [, b]) => b - a)
.reduce(
(r, [k, v]) => ({
total: r.total + v,
regions: { ...r.regions, [k]: v },
}),
{
total: 0,
regions: {},
}
);
return new Response(JSON.stringify({ counters }), { status: 200 });
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), {
status: 200,
});
}
});
Run locally
supabase start
supabase functions serve upstash-redis-counter --no-verify-jwt --env-file supabase/functions/upstash-redis-counter/.env
Navigate to http://localhost:54321/functions/v1/upstash-redis-counter.
Deploy
supabase functions deploy upstash-redis-counter --no-verify-jwt
supabase secrets set --env-file supabase/functions/upstash-redis-counter/.env