数据库与缓存笔记
数据库与缓存技术选型及实践笔记
一、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 核心差异对比表
| 特性维度 | SQLite | Microsoft Access | PostgreSQL |
|---|---|---|---|
| 架构与部署 | 嵌入式、无服务器,数据库为单一文件 | 桌面级文件-服务器型,基于 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 各数据库容量极限
| 数据库 | 理论最大容量 | 实际推荐单表上限 | 并发连接数 |
|---|---|---|---|
| SQLite | 281 TB | 100万 ~ 1000万条 | 单写,并发弱 |
| Access | 2 GB | 100万 ~ 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 -d7.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-apache7.5 关于 Redis 在部署中的实际状态
在以上 compose 配置中,Redis 虽然被部署但 Typecho 并未默认使用它。要让 Redis 真正生效,需要:
- 安装 Typecho 缓存插件(如 TeCache 或 Redis Cache for Typecho)
- 在插件设置中填写 Redis 连接信息(主机:redis,端口:6379)
- 设置合理的缓存过期时间(TTL)
- 确保在文章发布、评论更新时清理相关缓存
八、关键技术要点总结
8.1 数据库选型核心原则
- 不是比谁更强,而是看谁更适合当前场景
- 轻量级软件优先考虑 SQLite / Access
- 中小型 Web 应用考虑 MySQL / PostgreSQL
- 超大规模场景考虑 MongoDB / 分布式方案
8.2 Redis 定位总结
- Redis = 内存版的高速 Key-Value 存储
- 为了"快"放弃了复杂查询和完整事务
- Redis 不能替代关系型数据库做核心数据存储
- Redis 的主要价值在于缓存加速,而非数据持久化
8.3 架构设计关键点
- Redis 作为缓存层时需处理数据一致性问题
- 需防范缓存穿透、缓存击穿、缓存雪崩
- 写入操作仍需由主数据库完成,Redis 不能加速写入
- 对于博客场景,页面静态化比 Redis 缓存更直接有效