分类: 闲聊

  • 聊聊嵌入式数据库

    聊聊嵌入式数据库

    提到数据库,大多数人首先想到的都是 MySQL、PostgreSQL 或 Redis。但近年来,越来越多的桌面应用、浏览器扩展、边缘计算、IoT 设备,甚至一些后端服务,也开始选择使用嵌入式数据库。那么,什么是嵌入式数据库?它又有哪些优势?

    什么是嵌入式数据库?

    嵌入式数据库(Embedded Database)是一种直接集成到应用程序内部的数据库。

    它不像 MySQL 或 PostgreSQL 那样需要单独安装数据库服务,而是作为一个库文件随程序一起运行。

    也就是说:

    • 没有数据库服务器
    • 没有独立进程
    • 不需要监听端口
    • 不需要额外部署

    应用程序可以直接读写数据库文件。

    整个架构更加轻量。

    与传统数据库有什么区别?

    传统数据库通常采用客户端 / 服务端架构。

    应用程序
        │
        ▼
    MySQL Server
        │
        ▼
    数据库文件
    

    而嵌入式数据库则更加简单。

    应用程序
        │
        ▼
    嵌入式数据库
        │
        ▼
    数据库文件
    

    整个过程不需要网络通信,也没有额外的数据库服务。

    常见的嵌入式数据库

    目前比较流行的嵌入式数据库主要有下面几种。

    数据库 特点 适用场景
    SQLite 最经典、最成熟 手机 App、桌面软件
    BoltDB Go 原生 KV 数据库 Go 项目、本地配置
    bbolt BoltDB 的维护版本 Go 服务
    BadgerDB 高性能 LSM 数据库 缓存、本地索引
    Pebble CockroachDB 使用 高性能 KV
    LevelDB Google 开源 浏览器、缓存
    RocksDB Facebook 开源 大数据存储
    LMDB 内存映射数据库 高性能读取

    不同数据库各有特点。

    例如 SQLite 更偏向关系型数据库。

    而 BoltDB、BadgerDB 更适合作为 Key-Value 存储。

    为什么越来越受欢迎?

    1. 部署简单

    这是最大的优势。

    很多 Go 项目最终只需要一个可执行文件。

    如果数据库也是嵌入式的,那么部署时甚至只需要:

    app
    data.db
    

    无需安装:

    • MySQL
    • PostgreSQL
    • Redis

    整个部署过程非常简单。

    2. 性能并不差

    很多人认为:

    "没有数据库服务器,性能会不会很低?"

    实际上并不是。

    由于嵌入式数据库:

    • 没有网络通信
    • 没有 Socket
    • 没有 TCP
    • 没有 SQL 解析(部分数据库)

    很多简单读写场景反而更快。

    特别是:

    • 配置读取
    • 缓存
    • 日志
    • 本地索引

    性能往往非常优秀。

    3. 更容易发布

    很多开源项目都会提供:

    Windows
    
    Linux
    
    macOS
    

    三个版本。

    如果依赖 MySQL。

    用户还需要:

    安装数据库

    初始化

    创建用户

    导入 SQL

    配置连接

    而嵌入式数据库只需要:

    下载
    
    启动
    
    开始使用
    

    用户体验会好很多。

    4. 数据天然本地化

    很多桌面软件都会把数据保存在:

    config.db
    
    history.db
    
    cache.db
    

    复制数据库文件即可完成:

    • 备份
    • 迁移
    • 恢复

    不需要额外导出 SQL。

    有没有缺点?

    当然有。

    不适合高并发写入

    虽然很多嵌入式数据库支持并发。

    但对于:

    • 电商
    • 社交平台
    • 大型论坛

    这种高并发业务。

    仍然推荐:

    • MySQL
    • PostgreSQL

    因为它们拥有更加成熟的事务管理。

    不适合多台服务器共享

    嵌入式数据库本质上还是一个本地文件。

    例如:

    server-a
        │
    data.db
    
    server-b
        │
    data.db
    

    两台服务器不能同时写同一个数据库文件。

    因此:

    分布式

    主从同步

    读写分离

    这些能力通常需要额外实现。

    哪些项目适合使用?

    下面这些场景,其实都很适合。

    • 浏览器扩展
    • 桌面应用
    • Electron 项目
    • CLI 工具
    • NAS 应用
    • IoT 设备
    • 单机服务
    • 本地缓存
    • 配置中心
    • 日志系统

    很多人每天都在使用 SQLite。

    例如:

    • 微信
    • Chrome
    • Firefox
    • VS Code(部分数据)
    • Android
    • iOS

    它们内部都有 SQLite 的身影。

    Go 为什么喜欢嵌入式数据库?

    近年来越来越多 Go 项目开始采用:

    • bbolt
    • BadgerDB
    • Pebble

    原因很简单:

    Go 推崇:

    一个二进制文件完成部署。

    如果数据库也采用嵌入式。

    整个项目最终可能只需要:

    app
    config.yaml
    data.db
    

    部署体验非常优秀。

    这也是很多个人开发者和开源项目喜欢它的重要原因。

    选择数据库,不是追求"最强",而是找到最适合自己项目的方案。

  • 为什么越来越多的网站开始采用前后端分离?

    为什么越来越多的网站开始采用前后端分离?

    为什么越来越多的网站开始采用前后端分离?

    从传统的 PHP 网站,到如今流行的 Vue、React、Go、Node.js,越来越多的项目都开始采用「前后端分离」架构。那么,它到底解决了哪些问题?又为什么逐渐成为现代 Web 开发的主流?

    前言

    如果你接触过早期的网站开发,应该对这样的架构并不陌生。

    浏览器发起请求,服务器负责处理业务逻辑、查询数据库、渲染 HTML 页面,最后再返回给浏览器。

    整个流程看起来十分简单:

    浏览器
       │
       ▼
    PHP / Java / ASP.NET
       │
       ▼
    MySQL
    

    对于小型网站来说,这种模式开发效率很高,但随着业务越来越复杂,它的局限性也开始逐渐显现。

    什么是前后端分离?

    很多人第一次听到「前后端分离」,都会误以为只是把一个项目拆成两个项目。

    其实并不是。

    前后端分离真正的核心思想只有一句话:

    页面负责展示,服务负责数据。

    浏览器不再直接请求页面,而是通过 API 获取数据。

    整个流程变成了:

    浏览器(Vue / React)
            │
            ▼
         REST API
            │
            ▼
    Go / Java / Node.js
            │
            ▼
     MySQL / Redis
    

    后端不再负责拼接 HTML,而是统一返回 JSON 数据。

    前端则根据这些数据完成页面渲染。

    为什么越来越多人选择这种架构?

    1、一套接口,多端共享

    传统网站通常只有 PC 页面。

    后来又陆续出现了:

    • H5 页面
    • 微信小程序
    • Android App
    • iOS App
    • 桌面客户端

    如果还是采用传统模式,就意味着需要重复开发很多业务逻辑。

    而前后端分离之后:

    Vue
    React
    Flutter
    UniApp
    小程序
       │
       ▼
     同一套 API
    

    所有客户端都可以调用同一套接口。

    开发效率得到大幅提升。

    2、前端体验更流畅

    现代前端框架拥有很多优秀的能力,例如:

    • 组件化开发
    • 路由管理
    • 状态管理
    • 动画过渡
    • 局部刷新

    用户切换页面时,不需要重新加载整个网站。

    整个操作体验会更加丝滑。

    这也是为什么现在很多网站看起来更像一款桌面软件。

    3、后端更加专注

    以前的后端开发需要同时负责:

    • 页面模板
    • HTML
    • CSS
    • SQL
    • 业务逻辑

    项目越来越大之后,代码会变得非常臃肿。

    采用前后端分离之后,后端只需要关注:

    • 用户认证
    • 数据处理
    • 权限控制
    • API 设计

    页面展示完全交给前端完成。

    职责更加清晰,也更容易维护。

    前后端分离有哪些优势?

    总结下来,大致可以归纳为下面几点。

    优势 说明
    开发效率更高 前后端可以同时开发
    多端共享 一套 API 支持多个客户端
    更容易维护 职责划分更加清晰
    更方便扩展 后续增加 App、小程序成本更低
    部署更加灵活 前端、后端可以独立部署

    对于中大型项目来说,这些优势非常明显。

    有没有缺点?

    任何架构都不是万能的。

    前后端分离同样存在一些问题。

    SEO

    如果只是普通 SPA 应用,搜索引擎可能无法很好地抓取页面内容。

    因此现在很多项目都会采用:

    • SSR(服务端渲染)
    • SSG(静态站点生成)
    • ISR(增量静态生成)

    来兼顾 SEO 和用户体验。

    项目数量增加

    以前只有一个项目。

    现在可能会变成:

    frontend
    backend
    gateway
    nginx
    redis
    mysql
    

    开发、部署、运维都会稍微复杂一些。

    不过随着 Docker 的普及,这些问题已经没有以前那么明显了。

    所有项目都适合前后端分离吗?

    其实并不是。

    如果只是:

    • 企业官网
    • 个人博客
    • 宣传页面
    • Landing Page

    传统开发模式依然非常高效。

    但是如果项目包含:

    • 用户中心
    • 管理后台
    • App
    • 小程序
    • 开放 API
    • 第三方接入

    那么采用前后端分离会更加合适。

    我的理解

    在我看来,前后端分离最大的意义,并不是使用了 Vue、React 或者 Go。

    真正重要的是:

    让不同的系统各司其职。

    前端专注于用户体验。

    后端专注于业务逻辑。

    数据库专注于数据存储。

    每一层都有自己的职责。

    当项目越来越大时,这种架构带来的维护优势会越来越明显。

    如果这篇文章对你有所帮助,欢迎收藏、分享,也欢迎交流你对前后端分离架构的理解。