一句话说清楚 Turso 是什么

Turso 是一个兼容 SQLite 的数据库,但它不是简单的 SQLite 封装。它用 Rust 重写了 SQLite 的一个分支叫 libsql,保留了 SQLite 的文件格式和大部分语法,同时增加了分布式读取能力HTTP 访问

简单说:你仍然可以用 SELECT * FROM users 这种 SQLite 语法,但数据可以自动复制到全球多个边缘节点,用户就近读数据,延迟降到个位数毫秒。

它解决了什么问题?

SQLite 很好,但是单机。你想让手机 App 或者浏览器里的 SQLite 读取远端的数据库?以前要么走 REST API 把查询逻辑写在后端,要么用 WebSocket 把 SQL 转发到中心数据库。前者牺牲了 SQL 的灵活性,后者延迟高。

Turso 的做法是:客户端(边缘)装一个 libsql 的 SDK(支持 JS、Go、Python 等),这个 SDK 本地可以运行一个只读副本。写入操作会发回主节点,然后异步复制到所有只读副本。读取完全在本地完成。

技术上:Turso 使用了 sql.js + 自定义传输层,并且底层存储使用 SQLite VFS 将读请求重定向到本地副本。

一个能跑的最小例子

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

# 2. 登录并创建一个数据库(用官方云或自托管)
turso auth login
turso db create my-first-db

# 3. 获取连接字符串
turso db show --url my-first-db
# 会返回类似 libsql://my-first-db.turso.io

然后在你 Node.js 应用里:

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

const client = createClient({
  url: 'libsql://my-first-db.turso.io', // TLS 加密连接
  authToken: process.env.TURSO_AUTH_TOKEN
});

// 写入 (通过主节点)
await client.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)');
await client.execute('INSERT INTO users (id, name) VALUES (1, \"Alice\")');

// 读取 (本地副本)
const result = await client.execute('SELECT * FROM users');
console.log(result.rows); // [{ id: 1, name: 'Alice' }]

注意:INSERTUPDATEDELETE 这类写操作会通过网络发送到主节点;SELECT 默认走本地缓存,延迟几乎为零。

它和同类项目比好在哪?

最直接的竞品是 Cloudflare D1。两者都基于 SQLite,都面向边缘计算。

特性 Turso Cloudflare D1
部署方式 自托管 + 官方云 仅 Cloudflare Workers
读取延迟 可本地副本,<10ms 需查询回到主节点,40-80ms(海外)
写入延迟 200ms-500ms(跨区域) 100-300ms(同区域)
客户端 SDK JS/Go/Python/Rust 仅 Workers JS
离线能力 支持(本地副本可完全离线) 不支持

Turso 最大的优势是 读取延迟离线支持。如果你做的 App 需要经常读数据(比如博客前端、电商列表页),Turso 可以直接在浏览器 Service Worker 或者手机 App 里嵌入一个本地数据库副本,用户打开秒加载。

而 D1 更适合在 Workers 环境中使用,因为它与 Cloudflare 生态无缝集成,不用自己管理复制。

和原生 SQLite 比呢?

传统 SQLite 只能单机使用,Turso 把它变成了一个可同步的分布式数据库。代价是:

  • 写入速度变慢了(因为要经过网络到主节点)
  • 事务隔离等级降低(最终一致性)
  • 部分 SQLite 高级功能不支持(如 FTS5 全文搜索需要检查兼容性)

适用场景与暗坑

适合:

  • 读多写少的边缘应用(CMS 前端、静态内容、用户配置)
  • 需要离线容灾的移动端或桌面应用(本地副本断网可用)
  • 对延迟敏感的物联网终端(传感器读取配置)

不适合:

  • 高并发写入(比如社交动态、订单系统)—— 写入单点瓶颈
  • 需要强一致的场景(金融交易、库存扣减)—— 读取可能读到旧数据
  • 复杂跨表事务—— 分布式事务不是 Turso 的设计目标

1 个坑:
Turso 的副本是最终一致性。写入成功后,副本可能延迟几秒到几十秒才同步。如果你写入后立刻读取,可能读到旧值。这种场景需要设置 @libsql/clientsyncInterval 参数强制刷新,但会牺牲读取性能。

快速上手步骤

如果你只想体验:

bash
1 2 3 4 5 6
# 本地跑一个 Turso 实例(Docker)
docker run -d --name turso -p 8080:8080 \
  ghcr.io/tursodatabase/libsql-server:latest

# 然后用 CLI 连接
turso db create --from-local

更多细节看官方文档:https://docs.turso.tech

对我来说,Turso 最惊艳的不是性能(写入确实一般),而是 把 SQLite 放到了进程内还能同步 这个思路。如果你的 App 只需要少量写入但大量读取,值得为它单独开一个数据库服务。