Upstash Redis
这是一个Redis计数器示例,它存储了按区域统计的函数调用次数的哈希值。代码可在GitHub上找到。
Redis数据库设置
使用Upstash控制台或Upstash CLI创建一个Redis数据库。
选择Global
类型以最小化所有边缘节点的延迟。将UPSTASH_REDIS_REST_URL
和UPSTASH_REDIS_REST_TOKEN
复制到您的.env文件中。
您可以在详情 > REST API > .env下找到这些信息。
1cp supabase/functions/upstash-redis-counter/.env.example supabase/functions/upstash-redis-counter/.env
代码实现
请确保已安装最新版本的 Supabase CLI。
在您的项目中创建一个新函数:
1supabase functions new upstash-redis-counter
并将以下代码添加到 index.ts
文件:
12345678910111213141516171819202122232425262728293031323334import { 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 }) }})
本地运行
12supabase startsupabase functions serve --no-verify-jwt --env-file supabase/functions/upstash-redis-counter/.env
访问 http://localhost:54321/functions/v1/upstash-redis-counter。
部署
12supabase functions deploy upstash-redis-counter --no-verify-jwtsupabase secrets set --env-file supabase/functions/upstash-redis-counter/.env