边缘函数

Upstash Redis


这是一个Redis计数器示例,它存储了按区域统计的函数调用次数的哈希值。代码可在GitHub上找到。

Redis数据库设置

使用Upstash控制台Upstash CLI创建一个Redis数据库。

选择Global类型以最小化所有边缘节点的延迟。将UPSTASH_REDIS_REST_URLUPSTASH_REDIS_REST_TOKEN复制到您的.env文件中。

您可以在详情 > REST API > .env下找到这些信息。

1
cp supabase/functions/upstash-redis-counter/.env.example supabase/functions/upstash-redis-counter/.env

代码实现

请确保已安装最新版本的 Supabase CLI

在您的项目中创建一个新函数:

1
supabase functions new upstash-redis-counter

并将以下代码添加到 index.ts 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import { Redis } from 'https://deno.land/x/upstash_redis@v1.19.3/mod.ts'console.log(`函数 "upstash-redis-counter" 已启动运行!`)Deno.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 }) }})

本地运行

1
2
supabase startsupabase functions serve --no-verify-jwt --env-file supabase/functions/upstash-redis-counter/.env

访问 http://localhost:54321/functions/v1/upstash-redis-counter。

部署

1
2
supabase functions deploy upstash-redis-counter --no-verify-jwtsupabase secrets set --env-file supabase/functions/upstash-redis-counter/.env