NoSQL 非关系型数据库【简洁版】
1. Redis(键值数据库 KV,面试 / 工程重灾区)
1.1 八大基础数据结构与底层编码
String:底层 SDS;int/embstr/raw 三种对象编码
List:3.2 后 QuickList(ziplist + 双向链表)
Set:少量整数 IntSet,量大转 Dict 哈希表
ZSet:少量数据 ziplist,量大跳表 skiplist
Hash:小数据 ziplist,大数据 dict 哈希表
Geo:基于 ZSet 实现坐标距离计算、附近点位
Bitmap:本质 String 位图,签到、活跃统计、简易布隆
特殊扩展结构:
(1)Stream:基数树 RadixTree 存储消息 ID、消费组、Pending 队列、死信、消息回溯(2)HyperLogLog:稀疏 / 密集双结构,基数 UV 统计,pfmerge 合并
1.2 底层基础组件
SDS 动态字符串、双向链表、跳跃表 skiplist、压缩列表 ziplist、哈希表 dict
LRU/LFU 淘汰配套内部采样结构
1.3 IO 与事件模型
Redis6.0 前:主线程单线程处理命令解析、应答;持久化 / 同步走子进程
Redis6.0+:多线程负责网络 IO 读写,命令执行依旧单线程
IO 多路复用 epoll;文件事件 + 时间事件驱动
过期键三重删除策略:惰性删除、定期抽样删除、内存淘汰兜底
1.4 持久化:RDB + AOF + 混合持久化
RDB 快照
触发时机:save 配置、bgsave 手动、shutdown 关机、主从全量同步
bgsave 流程:fork 子进程、写时复制 COW、子进程落盘 RDB
痛点:fork 堆大阻塞、宕机丢失窗口数据;RDB 不保存过期时间
无盘复制:主不落地 RDB,直接流式发给从
AOF 日志
三种刷盘策略:always /everysec (默认) /no
AOF 重写机制:子进程后台合并指令,父进程缓冲新写入命令
混合持久化:RDB 文件头 + 增量 AOF 日志,兼顾恢复速度与数据安全
宕机风险:kill -9 丢失未落盘;正常 shutdown 自动 bgsave + 刷 AOF
1.5 内存全套管控
8 种内存淘汰策略 volatile-lru、allkeys-lru、volatile-lfu、allkeys-lfu、volatile-random、allkeys-random、volatile-ttl、noeviction (默认)
内存模型:对象头、ptr 编码优化、内存碎片成因
碎片优化:activedefrag 主动整理、关闭大页、ziplist 阈值调优
内存边界:maxmemory 不含复制缓冲区、客户端缓冲区、持久化缓冲
高危问题
bigkey 大键阻塞主线程;方案:拆分、unlink 惰性删除、异步分批删
client-output-buffer-limit 防缓冲区溢出崩节点
lazyfree (4.0+):unlink/flushdb async 后台释放内存不阻塞主线程
1.6 高可用三层架构:主从 → 哨兵 → Redis Cluster
1.6.1 主从复制
PSYNC2.0:复制偏移量、repl_backlog 环形缓冲区、断点续传
全量同步:RDB 传输 + 缓冲区补发增量;增量同步正常同步指令
异步复制;replica-wait 半同步可等待 N 台从确认
从默认只读;从节点不转发写命令
backlog 溢出会强制重新全量同步
1.6.2 哨兵 Sentinel
哨兵是特殊 Redis 节点,不存业务数据;集群互相自动发现
检测机制:PING 心跳 → 主观下线 → quorum 过半判定客观下线
故障转移选举权重:slave-priority > 复制偏移量 > 运行 ID
职责:监控、自动故障切换、配置下发、异常通知客户端
1.6.3 Redis Cluster 无中心集群
16384 哈希槽设计原因;CRC16 (key)%16384 定位槽
Gossip 节点通信协议,同步槽分配、故障状态
每个主节点独立一套主从,无全局主从
槽迁移流程:import→migrate→del,支持中断续迁
扩容 / 缩容:在线迁移哈希槽,不停机平滑伸缩
跨槽限制:MGET、事务、Lua、Pipeline 多槽报错;HashTag 强制同槽
集群可用性:所有槽必须分配完毕才可写入;主宕机且无从则集群不可用
1.7 缓存三大经典问题
缓存穿透:空值缓存、布隆过滤器、入参校验
缓存击穿:热点 key 互斥锁、逻辑过期、永不过期
缓存雪崩:过期时间随机偏移、集群高可用、多级缓存、限流熔断
1.8 缓存设计体系
四大读写模式:Cache Aside (旁路)、Read Through、Write Through、Write Back
缓存更新策略对比
先更新 DB 再删缓存(业界主流)
先更新 DB 再更新缓存
先删缓存再更新 DB
缓存预热:上线批量加载热点数据
缓存降级:Redis 故障切本地 Caffeine / 默认返回,保可用
多级缓存架构:本地堆缓存 + Redis 分布式缓存
序列化选型:JSON、Protobuf、JDK 序列化优劣对比
1.9 客户端高级能力
Pipeline 管道:批量发包、减少网络 RTT、无原子性
事务 MULTI/EXEC:命令排队,无回滚,语法错全失败、运行错部分成功
WATCH 乐观锁 CAS 机制
Lua 脚本:多条指令原子执行;SHA 缓存脚本;集群必须 key 同槽
连接模式:短连接、长连接、连接池
1.10 分布式锁完整方案
基础原子加锁:SET key val NX EX
防死锁:强制过期时间
可重入锁:Hash 结构存储持有者 + 计数(Redisson 实现)
看门狗续期:默认 30s 锁时长,每 10s 异步续期,防止任务未完成锁过期
释放锁:Lua 原子校验持有者再删除,避免误删他人锁
红锁 RedLock:多独立实例过半加锁,容错更高、落地少
集群锁漏洞:主加锁成功未同步从即宕机,新主出现重复锁;红锁缓解无法根除
2.1 基础概念
文档 (BSON) → 集合 → 数据库;BSON 支持二进制、ObjectId、日期、内嵌文档、数组
2.2 基础操作
CRUD、数组操作、文档嵌套读写、游标分页管理
2.3 聚合体系
完整聚合管道:match/project/group/sort/limit/skip/unwind 等操作符;explain 执行计划分析
2.4 特殊集合类型
Capped 固定集合:定大小、FIFO 自动淘汰,日志队列场景
Timeseries 时序集合:监控指标专用,自动分层压缩、时间分片
View 视图:虚拟只读集合,预封装聚合逻辑无物理存储
2.5 索引全类型
基础:单键、复合、唯一、稀疏索引
特殊:文本全文索引、2dsphere 地理索引、TTL 自动过期索引、部分索引
构建方式:前台阻塞构建 /background 后台在线构建
性能判定:IXSCAN 索引扫描、COLLSCAN 全表扫描
2.6 存储引擎 WiredTiger
MVCC 快照隔离,读不阻塞写、写不阻塞读
压缩算法:snappy/zlib/zstd,集合索引可单独配置
写前 Journal 日志,崩溃重做恢复;可关日志换性能
Checkpoint 定时落盘磁盘;WT Cache 冷热数据自动置换
2.7 副本集架构
三类节点:Primary 主、Secondary 从、Arbiter 仲裁 (只投票无数据)
特殊从节点:
Hidden 隐藏节点:不选举、不提供业务读,用于备份分析
Delayed 延迟从:延迟同步,误删回滚恢复
Oplog 环形日志:主所有写入存入 oplog,从拉取回放;oplog 不足会触发全量同步
选举规则:过半票数当选;priority 优先级调控权重
读写控制:
WriteConcern 写关注:w:1 /majority/w:N,平衡一致性性能
ReadPreference 五种读偏好:primary/primaryPreferred/secondary/secondaryPreferred/nearest
2.8 分片集群
组件:mongos 路由、shard 分片节点、config 配置三副本元数据
分片键 ShardKey:范围分片 / 哈希分片;分片键设计决定是否热点
Chunk 最小数据单元,默认 64MB;自动分裂、均衡迁移
Jumbo 超大块无法自动迁移,需手动拆分
mongos 无状态可无限水平扩容
2.9 事务能力
4.0 + 副本集支持多文档事务;4.2 + 分片跨分片事务
限制:单事务最大 16MB、超时限制、无法操作 system 集合与 capped 集合
隔离级别:仅快照读、读未提交,无标准 RC/RR 隔离
3.1 架构与依赖
依赖组件:Zookeeper(元数据、选举、故障检测)、HDFS(三副本持久存储)
核心进程:
HMaster:元数据管理、Region 负载均衡、故障分配
RegionServer:真实读写服务
3.2 核心数据模型
RowKey (唯一主键)、ColumnFamily 列族、Qualifier 列、时间戳 Version 多版本、单元格 TTL 过期
3.3 完整读写流程
写入:先写 WAL 预写日志 → 写入 MemStore 内存缓冲区
MemStore 满触发刷盘生成 StoreFile(底层 HFile)
读取:BlockCache 缓存 → MemStore → 磁盘 HFile;布隆过滤器快速过滤不存在 RowKey
3.4 WAL 预写日志
宕机依靠 WAL 恢复未刷盘 MemStore 数据
可关闭 WAL 换取极致写入性能(存在丢数风险)
WAL 滚动、归档、过期清理策略
3.5 Compaction 合并机制(性能核心)
Minor 小合并:少量 StoreFile 后台轻量合并
Major 大合并:全部文件合并,清理墓碑、旧多版本;IO 开销巨大
合并风暴风险:多 Region 同时合并拖垮集群;线上限流、错峰执行
3.6 数据删除逻辑
不物理立即删除,写入 Delete 墓碑标记;墓碑分 DeleteFamily/Column/Version;仅大合并时彻底清除
3.7 Region 全生命周期
自动分裂:Region 大小超限拆分为两个子 Region
手动合并小 Region 减少管理开销
Master 定时迁移 Region 均衡各 RS 负载
迁移流程:刷空 MemStore、转移元数据、目标 RS 打开 Region
3.8 性能优化关键点
RowKey 热点优化:加盐、哈希、反转、分段;禁止自增连续 RowKey
预分区:建表提前拆分 Region,避免上线单点写入压力
过滤器体系:行过滤、列过滤、值过滤,减少磁盘 IO
协处理器:Observer 拦截读写、Endpoint 自定义聚合计算
缓存体系:BlockCache (LRU/Bucket 堆外缓存)
BulkLoad 批量导入:绕过 MemStore 直接生成 HFile,海量高速入库
快照 Snapshot:表备份、克隆、误删回滚方案
3.9 适用边界
适合:PB 级宽表、日志、用户行为、大数据数仓底层、海量时序离线数据 不适合:高频低延迟在线事务、多条件复杂查询、小并发轻量业务
4. 其他 NoSQL 分类补充
4.1 时序数据库 TSDB(InfluxDB、Prometheus、TimescaleDB)
数据模型:时间戳 + 标签 tag + 指标 value
核心能力:数据降采样压缩、按时间 TTL 自动过期、时序聚合运算
场景:服务器监控、IoT 设备采集、业务指标大盘
4.2 图数据库 GraphDB(Neo4j、NebulaGraph)
模型:节点 (实体)、关系 (关联边)、双方属性
能力:深度图遍历、最短路径、社区发现、多跳关系查询
场景:社交关系、知识图谱、资金风控链路、个性化推荐网络
4.3 其他主流 NoSQL 补充
Cassandra(列族 AP 型):去中心化 Gossip、虚拟节点、可调一致性 QUORUM,跨机房多活
RocksDB/LevelDB(嵌入式磁盘 KV):LSM 树结构;Redis Module、HBase 底层存储引擎
Elasticsearch(广义文档搜索引擎 NoSQL):倒排索引、分词全文检索、分片副本架构,常与 Mongo 对比
NewSQL (TiDB/Spanner):融合 SQL + 分布式分片,不属于纯 NoSQL,用于强一致分片业务
5. NoSQL 底层理论与通用体系(必背面试基石)
5.1 CAP & BASE
CAP:分布式网络分区 P 必然存在,只能二选一
CP:Mongo 副本集、HBase(牺牲可用性保一致性)
AP:Redis Cluster、Cassandra、时序 / 图库(牺牲强一致保高可用)
BASE:基本可用、柔性状态、最终一致性,NoSQL 主流一致性模型
一致性梯度:强一致 > 会话一致 > 最终一致 > 弱一致
5.2 两大磁盘存储树对比
B + 树(Mongo WiredTiger、MySQL InnoDB):读性能优秀,写入有随机 IO 放大
LSM 树(HBase、RocksDB、时序库):顺序写入吞吐极强,读存在合并放大,适配海量写入
5.3 通用容灾与冷热分层
故障模式:节点宕机、网络分区、磁盘损坏、误删、写入热点击穿
容灾手段:副本、分片、快照定时备份、延迟从节点、异地多活
冷热分层策略
热:内存缓存 (Redis/BlockCache/WT Cache)
温:SSD 高性能盘
冷:机械盘、对象存储 OSS、归档高压缩
5.4 高频横向对比面试点
Redis vs MongoDB:并发、事务、查询能力、存储成本、一致性
MongoDB vs HBase:文档灵活结构 vs 固定列族宽表;实时中小型 vs PB 级离线海量
主从 / 哨兵 / Redis Cluster 三层架构适用规模区分
Redis 分布式锁 vs Zookeeper 分布式锁:ZK 是 CP 可靠性更高、性能更低
Cache Aside / ReadThrough / WriteThrough / WriteBack 四种缓存模型差异
5.5 NoSQL 选型对比速记
| 类型 | 代表 | 优势场景 | 短板 |
|---|---|---|---|
| KV | Redis | 缓存、分布式锁、计数、消息、超高并发 | 复杂查询弱、大数据存储成本高 |
| 文档 | MongoDB | 多变结构业务、中小型海量业务、灵活嵌套 | 事务性能一般,超海量分片复杂度高 |
| 列族 | HBase | PB 级离线海量宽表、大数据生态 | 延迟偏高,开发繁琐,实时事务差 |
| 时序 / 图 | Influx、Neo4j | 监控时序、关系网络专属场景 | 通用业务适配差 |
