Update README.md
Browse files
README.md
CHANGED
|
@@ -7,4 +7,70 @@ sdk: docker
|
|
| 7 |
pinned: false
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
pinned: false
|
| 8 |
---
|
| 9 |
|
| 10 |
+
-----
|
| 11 |
+
|
| 12 |
+
## title: FSD Cache Layer
|
| 13 |
+
emoji: 🚗
|
| 14 |
+
colorFrom: blue
|
| 15 |
+
colorTo: indigo
|
| 16 |
+
sdk: docker
|
| 17 |
+
app_port: 7860
|
| 18 |
+
pinned: false
|
| 19 |
+
|
| 20 |
+
# FSD Simulator 缓存中间层
|
| 21 |
+
|
| 22 |
+
挡在 Roblox 和 Turso 之间的轻量中间层。原则:**写勤读懒**。
|
| 23 |
+
|
| 24 |
+
- 写:玩家行为批量直通写入 Turso,不缓存。
|
| 25 |
+
- 读:统计结果缓存 12 小时(带 ±30 分钟抖动防雪崩),未命中才回源。
|
| 26 |
+
|
| 27 |
+
## 一、先在 Turso 建表(只做一次)
|
| 28 |
+
|
| 29 |
+
用 Turso 的 web shell 或 `turso db shell <你的库>` 执行:
|
| 30 |
+
|
| 31 |
+
```sql
|
| 32 |
+
CREATE TABLE IF NOT EXISTS driving_events (
|
| 33 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 34 |
+
user_id INTEGER NOT NULL,
|
| 35 |
+
scene TEXT NOT NULL,
|
| 36 |
+
action TEXT NOT NULL,
|
| 37 |
+
created_at INTEGER DEFAULT (unixepoch())
|
| 38 |
+
);
|
| 39 |
+
|
| 40 |
+
-- 关键索引!scene 被 WHERE + GROUP BY 用到,不建索引就会全表扫描,狂烧读配额
|
| 41 |
+
CREATE INDEX IF NOT EXISTS idx_scene ON driving_events (scene);
|
| 42 |
+
```
|
| 43 |
+
|
| 44 |
+
## 二、在 HF Space 填 3 个 Secret
|
| 45 |
+
|
| 46 |
+
Settings → Variables and secrets → 新建 **Secret**(不是 Variable,Secret 不会公开):
|
| 47 |
+
|
| 48 |
+
|名称 |值 |
|
| 49 |
+
|-------------|---------------------------------------|
|
| 50 |
+
|`TURSO_URL` |`https://你的库-你的组织.turso.io/v2/pipeline`|
|
| 51 |
+
|`TURSO_TOKEN`|Turso 的 Bearer Token |
|
| 52 |
+
|`APP_SECRET` |自己随便定一个口令,Roblox 端要用同一个 |
|
| 53 |
+
|
| 54 |
+
## 三、接口
|
| 55 |
+
|
| 56 |
+
|方法 |路径 |用途 |
|
| 57 |
+
|----|------------------------|-----------------------------|
|
| 58 |
+
|GET |`/` |保活,给 UptimeRobot ping |
|
| 59 |
+
|POST|`/log` |批量写入行为(需 `X-App-Key` 头) |
|
| 60 |
+
|GET |`/stats?scene=red_light`|查场景统计,缓存 12h(需 `X-App-Key` 头)|
|
| 61 |
+
|
| 62 |
+
写入请求体示例:
|
| 63 |
+
|
| 64 |
+
```json
|
| 65 |
+
{
|
| 66 |
+
"events": [
|
| 67 |
+
{"user_id": 123, "scene": "red_light", "action": "brake"},
|
| 68 |
+
{"user_id": 123, "scene": "merge", "action": "yield"}
|
| 69 |
+
]
|
| 70 |
+
}
|
| 71 |
+
```
|
| 72 |
+
|
| 73 |
+
## 四、UptimeRobot
|
| 74 |
+
|
| 75 |
+
新建 HTTP(s) monitor,URL 填 Space 首页地址,间隔 5 分钟。它只防休眠,
|
| 76 |
+
不保证缓存不丢——所以代码里”未命中就回源 Turso”这条铁律不能破。
|