反规范化是为了避免表连接操作、提高查询性能而有意引入冗余。五种手段:
| 手段 | 作用 |
|---|---|
| 增加冗余列 | 多个表具有相同列,查询时避免连接操作 |
| 增加派生列 | 列可由其他数据计算生成,查询时减少计算量、加快查询 |
| 重新组表 | 把经常一起连接的两个表合并为一个表,减少连接 |
| 水平分割表 | 按记录(行)分割到多个表——表规模很大、数据相对独立、需存多个介质时 |
| 垂直分割表 | 按属性(列)分割:主键+部分列一个表,主键+其他列另一个表——查询时减少 I/O 次数 |
反规范化的缺点:数据重复存储、浪费磁盘空间、可能产生数据不一致。保证一致性的手段:触发器、事务机制(单体数据库)、应用保证(异构数据库之间)、批处理脚本。
Redis:键值对形式的内存数据库,基于内存读写,适合缓存高频热点数据,降低数据库查询压力。
| 数据类型 | 特点 | 典型应用 |
|---|---|---|
| string | 基本类型 | 缓存层、计数器(播放量/浏览量) |
| hash | 代替 string,节省空间 | 用户信息 |
| set | 无序集合,值不重复 | 去重、抽奖、用户池 |
| list | 双向链表,可模拟栈/队列 | 评论、点赞 |
| zset | 有序集合,每元素带分数 | 热门帖子排行榜 |
过期策略:定期删除(每隔一段时间随机抽取过期 key 删除)+ 惰性删除(查询时发现过期才删除);再配合内存淘汰机制(volatile-lru / volatile-lfu / volatile-random / volatile-ttl / allkeys-lru / allkeys-lfu / allkeys-random / no-eviction)。
| 持久化 | RDB 内存快照 | AOF 日志 |
|---|---|---|
| 机制 | 把当前内存数据集快照写入磁盘,恢复时直接读入 | 持续保存服务器执行的更新命令(类似 MySQL binlog),恢复时从头回放 |
| 刷新频率/文件大小 | 低 / 小 | 高 / 大 |
| 恢复效率 / 数据安全 | 高 / 低(可能丢最后一次快照后的数据) | 低 / 高 |
| 问题 | 定义与原因 | 解决方案 |
|---|---|---|
| 缓存穿透 | 大量请求访问不存在的 key(恶意攻击、新业务上线 Redis 为空),请求直达数据库 | 限制来源 IP/黑名单;校验 key 合法性;布隆过滤器;缓存预热;前端流量控制;空 key 缓存(值为 null) |
| 缓存雪崩 | 大量 key 同时过期(相同过期时间)或 Redis 故障宕机,请求全部打到数据库,并级联影响上下游 | 过期时间加随机值均匀过期;主从复制/cluster 集群提高可用性;服务降级、熔断、限流 |
| 缓存击穿 | 少量热点 key 缓存时间失效(如秒杀"库存数量"过期时间太短),请求直达数据库 | 热点 key 不过期(或延长过期时间);互斥锁(只让一个请求回源重建缓存) |