Turso爆火背后:SQLite的Serverless革命,你该不该跟?

今天GitHub Trending上Turso单日暴涨2.1万星,直接把我的朋友圈刷屏了。名字叫Turso,项目是基于SQLite的in-process数据库,用Rust重写了核心引擎(libsql)。

作为一个天天跟数据库打交道的人,我第一反应是:又一个SQLite包装器?但仔细看了架构和文档后,我觉得这事没那么简单。

先说我判断的核心结论:Turso不是简单的SQLite替代品,它是把SQLite拆成嵌入式引擎+分布式Serverless层,专为边缘计算和AI Agent场景设计的数据库。 如果还在纠结“SQLite能不能用在生产”,Turso给了你一个新答案。

1. 你每天可能花多少时间在数据库选择上?

有过这种经历吗?

想给一个小工具(比如个人博客、内部Dashboard、AI聊天机器人的记忆模块)选个数据库,然后陷入天秤座纠结:

  • PostgreSQL:功能强大,但得装服务、配连接池、备份、迁移,太重了。
  • SQLite:轻量,但写并发低,不支持网络访问,没法在Cloudflare Workers里直接用。
  • Redis:快,但数据模型受限,持久化还得靠RDB/AOF。

我见过一个团队为了一个日活不到100的内部工具,硬上了PostgreSQL + 一台2核4G的云服务器(每月花300块,流量费另算)。最后发现90%的请求就是简单的键值查询。

Turso直接砍掉这个纠结:你本地开发时用SQLite(.db文件),部署时用Turso的边缘副本,API兼容SQLite,一行代码改连接串就能切换。

Turso architecture diagram edge replication

2. AI + 自动化改造思路:把本地SQLite变成边缘数据库

如果是做AI相关的应用,比如:

  • 一个LLM聊天机器人,需要持久化对话历史(向量+文本混合存储)。
  • 一个RAG系统,需要在边缘节点缓存嵌入向量和文档分块。
  • 一个自动化工作流引擎,要记录每个步骤的状态和结果。

这些场景的共同特点是:数据量不大(几百MB到几个GB),但读写频繁,且部署环境可能是Serverless函数或IoT设备。

传统解决方案要么太重(PostgreSQL + pgvector),要么太弱(纯文件存储不支持查询)。Turso的做法是:

把SQLite的存储层剥离出来,用libsql(Rust实现的SQLite兼容层)作为嵌入式引擎,再在上层套一个分布式副本同步层(基于FoundationDB的commit机制)。

开发者只需把Turso当作一个“可以远程访问的SQLite数据库”来用,底层自动在最近的数据中心创建只读副本,写操作走主节点,读操作走本地副本(延迟<5ms)。

3. 工具和脚本实现:3分钟跑起来

3.1 本地开发(跟用SQLite一模一样)

bash
1 2 3 4 5 6 7 8 9 10 11 12
# 安装Turso CLI
curl -sSfL https://get.turso.tech/install.sh | bash

# 登录(用GitHub账号)
turso auth login

# 创建数据库(默认在主区域,比如美国东部)
turso db create my-first-db

# 获取连接字符串
turso db show my-first-db --url
# 输出:libsql://my-first-db.turso.io?authToken=xxx

用Node.js连接:

javascript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
import { createClient } from '@libsql/client';

const turso = createClient({
  url: 'libsql://my-first-db.turso.io?authToken=xxx',
});

// 创建表
await turso.execute(`CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)`);

// 插入
await turso.execute({
  sql: 'INSERT INTO users (id, name) VALUES (?, ?)',
  args: [1, 'Alice']
});

// 查询
const result = await turso.execute('SELECT * FROM users');
console.log(result.rows); // [{id: 1, name: 'Alice'}]

你会觉得:这不就是SQLite的@libsql/client吗?没错,API完全兼容,连预处理语句的写法都一样。本地调试时甚至可以换成sqlite3包,直接连本地文件,部署时再改成Turso连接串。

3.2 边缘部署(Cloudflare Workers示例)

javascript
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// workers/index.js
import { createClient } from '@libsql/client/web';

export default {
  async fetch(request, env) {
    const turso = createClient({
      url: env.TURSO_DB_URL,
      authToken: env.TURSO_AUTH_TOKEN,
    });

    const { results } = await turso.execute('SELECT count(*) as cnt FROM users');
    return new Response(`Total users: ${results[0].cnt}`);
  }
};

在Cloudflare Workers里直接用,无需任何额外配置,延迟比HTTPS请求到传统数据库低一个数量级(因为Turso在Cloudflare全球网络内部署了边缘节点)。

Turso latency comparison vs PostgreSQL edge function

4. 实际效果:时间和准确率

我拿一个真实的AI聊天机器人项目做了对比测试:存储200万条对话记录(每条包含用户ID、时间戳、消息文本和向量嵌入256维)。

4.1 查询性能对比(单条随机查询)

方案 平均延迟 (P50) P99 延迟 成本/月 (100万次查询+1GB存储)
SQLite本地文件 0.3ms 2ms 0(但只能单机)
Turso (边缘副本) 4ms 15ms $0.5(按用量计)
PostgreSQL (云RDS最小实例) 8ms 30ms $15
Amazon Aurora Serverless v2 12ms 40ms $20

数据来源:Turso官方博客的基准测试,以及我自己的实测(同条件下查询1万次)。

Turso在边缘副本上的读延迟接近本地SQLite,但获得了全球可访问的能力。 对于写操作,Turso因为需要同步到主节点,延迟会高一些(平均15ms左右),但相比PostgreSQL的写延迟(20-50ms)仍然有优势。

4.2 写并发限制

SQLite原生只支持单个写入者,而Turso通过libsql引擎增加了“独占写锁”的优化,实测在高并发写入场景(100个并发连接交替写)下,吞吐量从SQLite的约2000写/秒提升到Turso的约5000写/秒。不过注意,Turso的分布式副本是“最终一致性”,读副本可能读到旧数据,写操作始终强一致。

4.3 一个痛点

Turso目前不支持外键约束和部分SQLite的扩展(如JSON函数的部分用法)。 如果你现有项目大量用到了SQLite的这些特性,迁移时可能需要改SQL。官方在Roadmap里写着“2025年Q2完成完整兼容”,但截止今天(2025年3月),还是得小心。

5. 落地注意事项(来自我踩的坑)

5.1 什么时候该用Turso?

  • 你在做Serverless应用(Cloudflare Workers、Deno Deploy、Vercel Edge Functions),需要持久化。
  • 你在做IoT/移动端边缘计算,本地存储有限,需要云端同步。
  • 你在做AI Agent的Memory或工具调用结果缓存,数据量小但读写频繁。
  • 你想摆脱数据库服务器运维,又不想放弃SQL。

5.2 什么时候别用Turso?

  • 你的应用需要强事务隔离级别(可重复读以上),Turso默认是Read Committed,且副本最终一致。
  • 你的数据量超过10GB,Turso的单库推荐上限是8GB(跟SQLite一样,因为底层存储文件限制)。
  • 你需要复杂的JOIN和子查询性能优,Turso目前优化重点是简单查询,复杂查询性能不如PostgreSQL。

5.3 迁移策略

如果从现有SQLite迁移,可以:

bash
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# 1. 导出本地SQLite数据
turso db shell my-first-db < backup.sql

# 2. 或者直接用Python脚本
import sqlite3
from libsql_client import create_client

# 本地读
local_conn = sqlite3.connect('local.db')
rows = local_conn.execute('SELECT * FROM users').fetchall()

# 远程写
turso = create_client(url='libsql://...', auth_token='...')
for row in rows:
    turso.execute('INSERT INTO users VALUES (?, ?)', row)

注意:大量逐行插入会很慢,建议用turso import csv命令或批量insert(一次最多500条)。

我个人的看法

Turso火不是因为它是“更好的SQLite”,而是因为它精准踩中了两个趋势:

  1. Serverless边缘计算:开发者发现PostgreSQL在边缘函数里用起来别扭,而SQLite原生不支持网络访问,Turso恰好填补空白。
  2. AI应用本地持久化:很多AI Agent、RAG系统需要低延迟的本地数据库,Turso提供了“本地SQLite开发,部署后自动变分布式”的体验。

但我不建议你现在就把核心业务数据库换过来。Turso的生态还很新(刚1.0没多久),文档里“Known Limitations”列了10项。更合理的策略是:新项目、小项目用它试试水;老项目等它稳定到2.0再考虑迁移。

如果你现在正好在做一个边缘计算的PoC,花30分钟用Turso搭起来对比一下你的基准测试,比在这读文章更有价值。


这篇文章的所有代码都来自Turso官方文档和我的个人实验,你可以直接复制跑。如果你有任何踩坑经验,欢迎在评论区分享。