数据库与缓存技术选型及实践笔记

一、Access 数据库基础

1.1 Access 命令行模式

Access 数据库本身没有像 MySQL 或 SQLite 那样的独立命令行交互界面,无法在终端中直接执行 SQL 语句。但支持通过命令行启动 Access 程序并带上参数,实现自动化操作。

基础格式:

"路径\msaccess.exe" "数据库路径.accdb" [参数]

常用参数:

  • /ro:只读模式打开
  • /excl:独占模式打开
  • /compact:压缩与修复数据库
  • /x 宏名称:打开数据库并自动运行指定宏
  • /runtime:运行时模式,隐藏设计界面
  • /cmd "参数":向数据库传递字符串参数,VBA 中可用 Command() 函数接收

注意:/cmd 参数仅传递信息,不会自动触发代码执行,需配合 AutoExec 宏和 VBA 函数实现启动逻辑。

1.2 Python 操作 Access 数据库

三种主要方法:

方法一:pyodbc(ODBC 连接)

  • 适用平台:仅 Windows
  • 依赖:需安装 Microsoft Access 数据库引擎
  • 功能:支持增删改查、调用宏
  • 示例:

    import pyodbc
    conn_str = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\path\to\database.accdb;'
    conn = pyodbc.connect(conn_str)
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM YourTable")
    cursor.execute("EXEC YourMacroName")
    conn.commit()

方法二:access-parser(直接解析)

  • 适用平台:跨平台(Windows、macOS、Linux)
  • 依赖:无需外部依赖
  • 限制:主要用于读取,不支持修改或执行 SQL
  • 示例:

    from access_parser import AccessParser
    db = AccessParser("/path/to/database.accdb")
    table_data = db.parse_table("YourTable")

方法三:pywin32(COM 自动化)

  • 适用平台:仅 Windows
  • 依赖:需安装 Access 软件
  • 功能:可操作高级功能如运行宏、读写 VBA 代码

1.3 Access 文件格式识别

Access 数据库文件头包含 Standard Jet DB 标识,这是 Jet/ACE 数据库引擎的明确标记。此格式与 SQLite 格式(文件头为 SQLite format 3)完全不同,两者无法互相同步。


二、SQLite、Access、PostgreSQL 对比

2.1 核心差异对比表

特性维度SQLiteMicrosoft AccessPostgreSQL
架构与部署嵌入式、无服务器,数据库为单一文件桌面级文件-服务器型,基于 Windows DLL独立服务器进程,需安装配置
适用场景单机应用、移动端、边缘设备个人或小团队桌面应用快速开发Web应用、数据分析、高并发 OLTP
性能与并发轻量快速,并发写入能力极弱单机性能尚可,多用户并发较差性能强大,高并发支持好
功能与生态功能简洁,支持标准 SQL有图形界面,支持 VBA 开发功能极丰富,支持高级 SQL 特性
成本完全免费商业软件,需 Office 授权完全开源免费
跨平台性极佳,支持所有主流平台仅支持 Windows优秀,支持所有主流服务器 OS

2.2 数据量级适用建议

数据量级推荐方案原因
100 条以下.ini / .json / .xml文本文件足够
100 ~ 1,000 条推荐 SQLite开始需要索引和查询能力
1,000 ~ 10 万条SQLite依然流畅,零配置
10 万 ~ 1,000 万条Access 或 SQLite(优化后)两者在此区间均可用
100 万 ~ 1 亿条MySQL / PostgreSQL需要独立服务器和专业运维
1 亿 ~ 10 亿条PostgreSQL支持分区、并行查询等高级特性
10 亿以上Oracle 或分布式数据库企业级支持

2.3 各数据库容量极限

数据库理论最大容量实际推荐单表上限并发连接数
SQLite281 TB100万 ~ 1000万条单写,并发弱
Access2 GB100万 ~ 500万条较差
MySQL文件系统限制1000万 ~ 1亿条数千
PostgreSQL无硬性限制1亿条以上数千

三、为什么华华鼠标点击器选用 Access

3.1 Access 的优势

  • 全家桶式开发平台:一个 .accdb 文件包含数据表、查询设计器、窗体、报表、宏和 VBA 代码
  • 部署简单:与 Windows 环境深度集成,用户电脑可能已有运行环境
  • 成本低:对于小型软件或个人开发者,几乎无额外成本
  • 数据类型校验:保证数据质量,避免格式错误导致软件崩溃

3.2 为什么不直接用 .ini 文件

  • .ini 适合存储简单的键值对配置(如窗口位置、用户偏好)
  • 华华鼠标点击器的核心数据是结构化的点击动作序列,每个动作包含坐标、按键、延迟、循环次数等字段
  • 需表达一对多关系(任务 vs 动作),.ini 难以实现
  • .db 支持精确增删改查(SQL),性能远优于文本文件的完整读写

3.3 为什么不用 SQL Server/MySQL

  • 部署和配置复杂,需要独立安装服务
  • 资源占用高,不适合轻量桌面工具
  • 功能过剩,数据量和并发量都不大

四、MySQL 与 MariaDB 对比

4.1 起源与理念

  • MySQL:由 Oracle 公司主导,双授权模式(社区版 + 企业版)
  • MariaDB:MySQL 的开源分支,由原始创始人发起,MariaDB 基金会管理,完全开源

4.2 功能特性差异

  • JSON 支持:MySQL 支持原生 JSON 数据类型;MariaDB 将 JSON 作为 LONGTEXT 别名
  • 存储引擎:MariaDB 提供 ColumnStore(列式存储)、MyRocks 等更多选择
  • 线程池:MariaDB 社区版内置;MySQL 社区版无此功能
  • GTID 实现不同,从 MySQL 迁移到 MariaDB 容易,反向迁移困难

4.3 选择建议

  • 选择 MariaDB:偏好完全开源、希望尝试更多存储引擎、Linux 发行版默认
  • 选择 MySQL:需要 MySQL 独有功能(如原生 JSON)、需要 Oracle 官方支持、使用云托管数据库服务

五、MongoDB 与 Redis 定位

5.1 MongoDB

  • 数据模型:文档型,类似 JSON
  • 核心优势:海量数据与高扩展,支持分片(Sharding)
  • 适用数据量级:TB 甚至 PB 级
  • 典型场景:内容管理系统、物联网数据、实时日志分析
  • 不适用于 Typecho 等结构化、小数据量场景

5.2 Redis

  • 全称:Remote Dictionary Server
  • 数据模型:键值对,Value 支持字符串、列表、哈希、集合、有序集合
  • 存储介质:内存为主,可选持久化
  • 读写速度:微秒级,百万 QPS
  • 数据容量:受物理内存限制(几 GB 到几十 GB)
  • 事务支持:MULTI/EXEC 保证顺序执行,但不支持回滚
  • 不支持复杂查询(多表 JOIN、聚合、子查询)
  • 典型场景:缓存、会话存储、实时排行榜、消息队列、计数器

5.3 数量级理解误区

  • Redis 的总数据量不受数据库本身的限制,受限于服务器物理内存
  • Redis 不是"更快一点的 Excel",而是"内存版的高速 Key-Value 存储"
  • Redis 的数据可以丢失(重启后从别处恢复),而 PostgreSQL 的数据不能丢

六、数据库访问模式与架构设计

6.1 Redis + PostgreSQL 配合使用

工作流程(旁路缓存模式):

用户请求 → 查 Redis → 命中 → 直接返回
                  ↓ 未命中
              查 PostgreSQL → 拿到数据 → 写入 Redis → 返回

写入策略(先更新数据库,再删除缓存):

  • 更新 PostgreSQL → 删除 Redis 中对应缓存
  • 下一次读取时因缓存未命中重新加载最新数据

6.2 三种模式适用场景

模式适用场景典型例子
只用 PostgreSQL数据量可控、并发不高、一致性要求极高个人博客、内部管理系统
只用 Redis数据可丢、读写极频繁、不需要持久化实时排行榜、验证码
Redis + PostgreSQL读多写少、数据重要但不能让数据库扛不住电商商品页、社交信息流

6.3 Redis 缓存层注意事项

  • 数据一致性问题:需合理设置 TTL 和更新策略
  • 三大经典问题:缓存穿透、缓存击穿、缓存雪崩
  • 内存成本:数据量大时硬件成本高
  • Redis 不能加速写入,写入仍需由主数据库完成

七、Typecho 博客部署实践

7.1 Typecho 支持的数据库

Typecho 官方支持 MySQL(MariaDB)、SQLite、PostgreSQL。不支持 MongoDB。Redis 需要通过第三方缓存插件实现。

7.2 数据库选型建议

  • SQLite:绝大多数个人博客足够,日均访问量低于 1000 IP 时首选
  • MySQL/PostgreSQL:访问量较大(如日均 PV 超过 1 万)或需要远程管理时使用

7.3 Podman Compose 部署方案

部署文件 compose.yaml:

services:
  postgres:
    image: docker.io/library/postgres:16-alpine
    container_name: typecho-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: typecho
      POSTGRES_PASSWORD: typecho123
      POSTGRES_DB: typecho
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U typecho -d typecho"]
      interval: 5s
      timeout: 3s
      retries: 5

  redis:
    image: docker.io/library/redis:7-alpine
    container_name: typecho-redis
    restart: unless-stopped
    command: ["redis-server", "--maxmemory", "128mb", "--maxmemory-policy", "allkeys-lru"]
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5

  typecho:
    image: eoyz369/typecho:1.2.1-php7.4-apache
    container_name: typecho-server
    restart: always
    ports:
      - "8080:80"
    environment:
      TYPECHO_DB_ADAPTER: Pdo_Pgsql
      TYPECHO_DB_HOST: postgres
      TYPECHO_DB_PORT: "5432"
      TYPECHO_DB_USER: typecho
      TYPECHO_DB_PASSWORD: typecho123
      TYPECHO_DB_DATABASE: typecho
      TYPECHO_DB_PREFIX: typecho_
      TYPECHO_SITE_URL: http://localhost:8080
    volumes:
      - typecho_data:/app/usr
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy

volumes:
  postgres_data: {}
  redis_data: {}
  typecho_data: {}

启动命令:

podman-compose -f compose.yaml up -d

7.4 手动创建 Pod 方式

# 创建 Pod
podman pod create --name typecho-pod -p 8080:80

# 启动 PostgreSQL
podman run -d --pod typecho-pod --name postgres \
  -e POSTGRES_USER=typecho \
  -e POSTGRES_PASSWORD=typecho123 \
  -e POSTGRES_DB=typecho \
  -v postgres_data:/var/lib/postgresql/data \
  docker.io/library/postgres:16-alpine

# 启动 Redis
podman run -d --pod typecho-pod --name redis \
  -v redis_data:/data \
  docker.io/library/redis:7-alpine \
  redis-server --maxmemory 128mb --maxmemory-policy allkeys-lru

# 启动 Typecho
podman run -d --pod typecho-pod --name typecho \
  -e TYPECHO_DB_ADAPTER=Pdo_Pgsql \
  -e TYPECHO_DB_HOST=localhost \
  -e TYPECHO_DB_PORT=5432 \
  -e TYPECHO_DB_USER=typecho \
  -e TYPECHO_DB_PASSWORD=typecho123 \
  -e TYPECHO_DB_DATABASE=typecho \
  -e TYPECHO_DB_PREFIX=typecho_ \
  -e TYPECHO_SITE_URL=http://localhost:8080 \
  -v typecho_data:/app/usr \
  eoyz369/typecho:1.2.1-php7.4-apache

7.5 关于 Redis 在部署中的实际状态

在以上 compose 配置中,Redis 虽然被部署但 Typecho 并未默认使用它。要让 Redis 真正生效,需要:

  1. 安装 Typecho 缓存插件(如 TeCache 或 Redis Cache for Typecho)
  2. 在插件设置中填写 Redis 连接信息(主机:redis,端口:6379)
  3. 设置合理的缓存过期时间(TTL)
  4. 确保在文章发布、评论更新时清理相关缓存

八、关键技术要点总结

8.1 数据库选型核心原则

  • 不是比谁更强,而是看谁更适合当前场景
  • 轻量级软件优先考虑 SQLite / Access
  • 中小型 Web 应用考虑 MySQL / PostgreSQL
  • 超大规模场景考虑 MongoDB / 分布式方案

8.2 Redis 定位总结

  • Redis = 内存版的高速 Key-Value 存储
  • 为了"快"放弃了复杂查询和完整事务
  • Redis 不能替代关系型数据库做核心数据存储
  • Redis 的主要价值在于缓存加速,而非数据持久化

8.3 架构设计关键点

  • Redis 作为缓存层时需处理数据一致性问题
  • 需防范缓存穿透、缓存击穿、缓存雪崩
  • 写入操作仍需由主数据库完成,Redis 不能加速写入
  • 对于博客场景,页面静态化比 Redis 缓存更直接有效

标签: none

添加新评论