NoSQL 数据库
NoSQL (Not Only SQL) 数据库提供了关系型数据库之外的数据存储方式。通过灵活的数据模型、水平扩展等特性满足大规模数据处理需求。
NoSQL 类型
键值存储
- Redis: 内存数据库、高性能、丰富数据结构
- Memcached: 缓存系统、简单键值、高并发
- DynamoDB: AWS 托管、无服务器、按使用计费
文档数据库
- MongoDB: 文档格式、灵活 Schema、ACID 事务
- CouchDB: RESTful API、主从复制、冲突解决
- Firebase: 实时数据库、云托管、移动优先
列族存储
- HBase: 分布式列存储、大规模数据、Hadoop 生态
- Cassandra: P2P 架构、高可用、最终一致
- ClickHouse: OLAP 分析、列式压缩、查询性能
搜索引擎
- Elasticsearch: 全文搜索、实时分析、近似就绪
- Solr: 分布式搜索、企业级、灵活配置
- Meilisearch: 轻量级搜索、接近就绪、用户体验
图数据库
- Neo4j: 原生图数据库、ACID 事务、查询语言 Cypher
- ArangoDB: 多模型、图查询、ACID 事务
- TigerGraph: 大规模图、实时分析、图机器学习
MongoDB
核心概念
- 文档: JSON-like 格式、嵌套结构、灵活 Schema
- 集合: 文档的集合、类似表、无强制 Schema
- 数据库: 集合的集合、逻辑隔离
- ObjectId: 自生成 ID、时间戳、机器标识
查询操作
- CRUD: Create、Read、Update、Delete
- 查询语言: MongoDB Query Language、灵活条件
- 聚合管道: Pipeline 处理、多阶段转换、丰富操作
- 正则表达式: 文本匹配、模糊查询
索引与优化
- 索引类型: 单字段、复合、数组、文本索引
- 写入优化: Bulk Insert、WriteConc concern
- 查询优化: Explain、执行计划、索引使用
事务支持
- 单文档事务: 原子操作、嵌套字段更新
- 多文档事务: 4.0+ 支持、ACID 保证
- 会话: 客户端会话、事务隔离
Redis
数据结构
- String: 文本、二进制、计数、缓存
- List: 队列、栈、消息队列、排行榜
- Set: 去重、集合运算、标签系统
- Hash: 对象映射、嵌套字段、参数存储
- Sorted Set: 排序集合、排行榜、去重计数
持久化
- RDB: 快照持久化、定时保存、恢复快速
- AOF: 命令日志、精细控制、文件较大
- 混合持久化: 结合两者优点、平衡性能
高可用架构
- 主从复制: 数据同步、读写分离、故障转移
- 哨兵模式: 自动故障转移、监控、故障恢复
- 集群模式: 分片存储、高可用、横向扩展
应用场景
- 缓存: 热数据缓存、降低数据库压力
- 会话存储: 分布式会话、跨服务共享
- 排行榜: 实时排行、计数器、排序快速
- 消息队列: 异步处理、任务队列、发布订阅
数据一致性
CAP 理论
- Consistency (一致性): 数据一致、同时更新
- Availability (可用性): 系统可用、故障恢复
- Partition Tolerance (分区容错): 网络分区、节点故障
- 权衡: 三选二、不同数据库不同选择
最终一致性
- 定义: 短期不一致、最终一致、实用折衷
- 同步和异步: 同步写、异步复制、版本向量
- 冲突解决: 最后写入胜出、应用自定义、向量时钟
分布式特性
水平扩展
- 分片: ShardKey、一致性 Hash、范围分片
- 副本: 数据副本、故障转移、读扩展
- 跨地域: 多数据中心、延迟处理、故障恢复
分布式事务
- 两阶段提交: Prepare、Commit、Abort
- Saga 模式: 长事务、补偿机制、编程复杂
- 最终一致: 异步确认、重试机制、应用容错
选型考虑
对比分析
| 数据库 | 一致性 | 可用性 | 数据模型 | 水平扩展 | 事务 | 适用场景 |
|---|---|---|---|---|---|---|
| MongoDB | 强 | 中 | 文档 | ⭐⭐⭐⭐ | ✅ | CMS、内容管理、快速开发 |
| Redis | 弱 | 强 | 键值 | ⭐⭐⭐ | 限定 | 缓存、会话、实时应用 |
| Cassandra | 弱 | ⭐⭐⭐⭐⭐ | 列族 | ⭐⭐⭐⭐⭐ | ❌ | 时序数据、大规模日志 |
| Elasticsearch | 中 | ⭐⭐⭐⭐ | 文档+索引 | ⭐⭐⭐⭐ | 有限 | 全文搜索、日志分析、指标 |
选型原则
- 数据特性: 结构化、半结构化、非结构化
- 访问模式: 读密集、写密集、混合负载
- 规模: 数据量、并发量、增长预期
- 一致性: 强一致、最终一致、一致性要求
- 运维: 复杂度、维护成本、学习成本
最佳实践
设计优化
- 数据模型: 嵌套与链接平衡、冗余存储
- 索引策略: 查询模式优先、避免过度索引
- 避免反模式: N+1 查询、过度规范化
性能优化
- 查询优化: 使用索引、减少扫描、选择性查询
- 写入优化: 批量操作、异步写入、背压处理
- 缓存策略: 读写分离、暖缓存、缓存更新
可靠性
- 备份恢复: 定期备份、恢复验证、灾难恢复
- 监控告警: 关键指标、告警规则、预警机制
- 容错设计: 多副本、故障转移、故障检测