一、Redis持久化机制
1. RDB快照(Snapshot)
-
核心原理:
- 全量二进制备份,保存为dump.rdb文件
- 触发条件:save 60 1000 # 60秒内至少1000次修改触发
save 300 10 # 300秒内至少10次修改触发 - 手动触发:
- SAVE:同步保存,阻塞主线程
- BGSAVE:异步保存,fork子进程操作(推荐)
-
COW机制(Copy-On-Write):
#mermaid-svg-ItTb0naRZqIneFy5 {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ItTb0naRZqIneFy5 .error-icon{fill:#552222;}#mermaid-svg-ItTb0naRZqIneFy5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ItTb0naRZqIneFy5 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ItTb0naRZqIneFy5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ItTb0naRZqIneFy5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ItTb0naRZqIneFy5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ItTb0naRZqIneFy5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ItTb0naRZqIneFy5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ItTb0naRZqIneFy5 .marker.cross{stroke:#333333;}#mermaid-svg-ItTb0naRZqIneFy5 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ItTb0naRZqIneFy5 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-ItTb0naRZqIneFy5 .cluster-label text{fill:#333;}#mermaid-svg-ItTb0naRZqIneFy5 .cluster-label span{color:#333;}#mermaid-svg-ItTb0naRZqIneFy5 .label text,#mermaid-svg-ItTb0naRZqIneFy5 span{fill:#333;color:#333;}#mermaid-svg-ItTb0naRZqIneFy5 .node rect,#mermaid-svg-ItTb0naRZqIneFy5 .node circle,#mermaid-svg-ItTb0naRZqIneFy5 .node ellipse,#mermaid-svg-ItTb0naRZqIneFy5 .node polygon,#mermaid-svg-ItTb0naRZqIneFy5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ItTb0naRZqIneFy5 .node .label{text-align:center;}#mermaid-svg-ItTb0naRZqIneFy5 .node.clickable{cursor:pointer;}#mermaid-svg-ItTb0naRZqIneFy5 .arrowheadPath{fill:#333333;}#mermaid-svg-ItTb0naRZqIneFy5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ItTb0naRZqIneFy5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ItTb0naRZqIneFy5 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ItTb0naRZqIneFy5 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ItTb0naRZqIneFy5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ItTb0naRZqIneFy5 .cluster text{fill:#333;}#mermaid-svg-ItTb0naRZqIneFy5 .cluster span{color:#333;}#mermaid-svg-ItTb0naRZqIneFy5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ItTb0naRZqIneFy5 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}fork修改数据主线程子进程读取内存数据复制数据副本写入RDB文件
-
RDB优缺点:
优点缺点 文件紧凑,恢复速度快 数据安全性低(可能丢失最后一次快照后的数据) 最大化Redis性能 大数据量时fork耗时可能阻塞服务 适合灾难恢复 不支持增量备份
2. AOF追加文件(Append Only File)
-
核心原理:
- 记录所有写操作命令(RESP协议格式)
- 写入策略:appendfsync always # 每次写都刷盘(安全但性能差)
appendfsync everysec # 每秒刷盘(推荐)
appendfsync no # 依赖操作系统刷盘(最快但可能丢失数据)
-
AOF重写(Rewrite):
- 触发条件:auto-aof-rewrite-percentage 100 # 文件增长100%触发
auto-aof-rewrite-min-size 64mb # 最小重写文件大小 - 重写过程:
- fork子进程扫描内存数据
- 生成新AOF文件(包含最小命令集)
- 替换旧文件(原子操作)
- 触发条件:auto-aof-rewrite-percentage 100 # 文件增长100%触发
AOF优缺点:
数据安全性高(最多丢失1秒数据) | 文件体积大 |
支持断点续传 | 恢复速度比RDB慢 |
可读性强(RESP文本格式) | 写入性能略低于RDB |
3. 混合持久化(Redis 4.0+)
- 配置启用:aof-use-rdb-preamble yes
- 文件结构:[RDB头部] + [增量AOF命令]
- 优势:
- 快速加载RDB部分
- 完整数据保障(AOF增量)
二、主从复制架构
1. 搭建步骤
# 从节点配置
replicaof 192.168.0.55 6379 # Redis 5.0+
slave-read-only yes # 从节点只读
2. 工作原理
- 全量复制:#mermaid-svg-l90uJvzyw2UzKxet {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-l90uJvzyw2UzKxet .error-icon{fill:#552222;}#mermaid-svg-l90uJvzyw2UzKxet .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-l90uJvzyw2UzKxet .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-l90uJvzyw2UzKxet .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-l90uJvzyw2UzKxet .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-l90uJvzyw2UzKxet .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-l90uJvzyw2UzKxet .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-l90uJvzyw2UzKxet .marker{fill:#333333;stroke:#333333;}#mermaid-svg-l90uJvzyw2UzKxet .marker.cross{stroke:#333333;}#mermaid-svg-l90uJvzyw2UzKxet svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-l90uJvzyw2UzKxet .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-l90uJvzyw2UzKxet text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-l90uJvzyw2UzKxet .actor-line{stroke:grey;}#mermaid-svg-l90uJvzyw2UzKxet .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-l90uJvzyw2UzKxet .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-l90uJvzyw2UzKxet #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-l90uJvzyw2UzKxet .sequenceNumber{fill:white;}#mermaid-svg-l90uJvzyw2UzKxet #sequencenumber{fill:#333;}#mermaid-svg-l90uJvzyw2UzKxet #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-l90uJvzyw2UzKxet .messageText{fill:#333;stroke:#333;}#mermaid-svg-l90uJvzyw2UzKxet .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-l90uJvzyw2UzKxet .labelText,#mermaid-svg-l90uJvzyw2UzKxet .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-l90uJvzyw2UzKxet .loopText,#mermaid-svg-l90uJvzyw2UzKxet .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-l90uJvzyw2UzKxet .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-l90uJvzyw2UzKxet .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-l90uJvzyw2UzKxet .noteText,#mermaid-svg-l90uJvzyw2UzKxet .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-l90uJvzyw2UzKxet .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-l90uJvzyw2UzKxet .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-l90uJvzyw2UzKxet .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-l90uJvzyw2UzKxet .actorPopupMenu{position:absolute;}#mermaid-svg-l90uJvzyw2UzKxet .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-l90uJvzyw2UzKxet .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-l90uJvzyw2UzKxet .actor-man circle,#mermaid-svg-l90uJvzyw2UzKxet line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-l90uJvzyw2UzKxet :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}SlaveMaster1. 发送PSYNC命令,请求同步数据,在这之前会跟master建立长连接2. 收到PSYNC,进行数据持久化,通过bgsave生成最新的rdb文件3. 发送RDB文件4. 清空旧数据5. 加载RDB6. 生成rdb之后的写命令,被master缓存在内存中7. 发送缓存命令8 加载缓存命令SlaveMaster
- 部分复制(PSYNC):
- 基于offset和repl_backlog_buffer实现断点续传
3. 复制风暴优化
#mermaid-svg-5EBcmFCHPFtdtjLt {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt .error-icon{fill:#552222;}#mermaid-svg-5EBcmFCHPFtdtjLt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5EBcmFCHPFtdtjLt .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-5EBcmFCHPFtdtjLt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5EBcmFCHPFtdtjLt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5EBcmFCHPFtdtjLt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5EBcmFCHPFtdtjLt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5EBcmFCHPFtdtjLt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5EBcmFCHPFtdtjLt .marker.cross{stroke:#333333;}#mermaid-svg-5EBcmFCHPFtdtjLt svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5EBcmFCHPFtdtjLt .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt .cluster-label text{fill:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt .cluster-label span{color:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt .label text,#mermaid-svg-5EBcmFCHPFtdtjLt span{fill:#333;color:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt .node rect,#mermaid-svg-5EBcmFCHPFtdtjLt .node circle,#mermaid-svg-5EBcmFCHPFtdtjLt .node ellipse,#mermaid-svg-5EBcmFCHPFtdtjLt .node polygon,#mermaid-svg-5EBcmFCHPFtdtjLt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5EBcmFCHPFtdtjLt .node .label{text-align:center;}#mermaid-svg-5EBcmFCHPFtdtjLt .node.clickable{cursor:pointer;}#mermaid-svg-5EBcmFCHPFtdtjLt .arrowheadPath{fill:#333333;}#mermaid-svg-5EBcmFCHPFtdtjLt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5EBcmFCHPFtdtjLt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5EBcmFCHPFtdtjLt .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-5EBcmFCHPFtdtjLt .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-5EBcmFCHPFtdtjLt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5EBcmFCHPFtdtjLt .cluster text{fill:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt .cluster span{color:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5EBcmFCHPFtdtjLt :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}MasterSlave1Slave2Slave3Slave4
三、哨兵高可用架构
1. 哨兵配置
sentinel monitor mymaster 192.168.0.55 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
2. 故障转移流程
3. Java客户端集成
// Jedis哨兵连接池
Set<String> sentinels = new HashSet<>();
sentinels.add("192.168.0.55:26379");
JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels);
四、Spring Boot集成示例
1. 配置模板
spring:
redis:
sentinel:
master: mymaster
nodes: 192.168.0.55:26379,192.168.0.55:26380
lettuce:
pool:
max-active: 20
max-wait: 1000
2. 操作模板
@RestController
public class TestController {
@Autowired
private StringRedisTemplate redisTemplate;
@GetMapping("/set")
public String setKey(String key, String value) {
redisTemplate.opsForValue().set(key, value);
return "OK";
}
}
五、数据备份策略
定时备份脚本:
#!/bin/bash
cp /var/lib/redis/dump.rdb /backup/redis/$(date +%Y%m%d%H).rdb
find /backup/redis -mtime +2 -delete
跨机房备份:
rsync -avz /backup/redis/ user@backup-server:/redis_backup/
六、性能优化关键参数
maxmemory | 物理内存的70% | 防止OOM |
maxmemory-policy | volatile-lru | 淘汰策略 |
tcp-backlog | 511 | 高并发连接队列 |
repl-backlog-size | 128MB | 主从复制缓冲区 |
client-output-buffer-limit | 256MB 64MB 60 | 客户端输出缓冲区限制 |
七、常见问题解决方案
Q1: 主从数据不一致?
- 方案:
- 检查网络延迟
- 增大repl-backlog-size
- 使用WAIT命令同步复制
Q2: AOF文件过大?
- 方案:
- 手动执行BGREWRITEAOF
- 调整重写触发阈值
Q3: 故障转移时间过长?
- 方案:
- 调小down-after-milliseconds
- 增加哨兵节点数量
通过合理配置持久化策略和搭建高可用架构,Redis可满足企业级生产环境需求。建议根据业务特点选择RDB+AOF混合模式,并配合哨兵实现自动故障转移。
评论前必须登录!
注册