系列导读:本篇将深入讲解 Redis 集群架构设计与性能优化最佳实践。
文章目录
-
- [一、Redis 集群架构](#一、Redis 集群架构)
-
- [1.1 架构演进](#1.1 架构演进)
- [1.2 架构对比](#1.2 架构对比)
- 二、主从复制
-
- [2.1 复制原理](#2.1 复制原理)
- [2.2 配置步骤](#2.2 配置步骤)
- 三、哨兵模式
-
- [3.1 架构图](#3.1 架构图)
- [3.2 配置示例](#3.2 配置示例)
- [3.3 故障转移流程](#3.3 故障转移流程)
- [四、Cluster 模式](#四、Cluster 模式)
-
- [4.1 架构图](#4.1 架构图)
- [4.2 槽位分配](#4.2 槽位分配)
- [4.3 配置示例](#4.3 配置示例)
- [4.4 Java 客户端](#4.4 Java 客户端)
- 五、性能优化
-
- [5.1 内存优化](#5.1 内存优化)
- [5.2 网络优化](#5.2 网络优化)
- [5.3 持久化优化](#5.3 持久化优化)
- [5.4 大 Key 优化](#5.4 大 Key 优化)
- 总结
一、Redis 集群架构
1.1 架构演进
单机模式 → 主从复制 → 哨兵模式 → Cluster 模式
┌─────────────────────────────────────────────────────────────┐
│ 架构演进目标 │
├─────────────────────────────────────────────────────────────┤
│ 单机:简单,但无法高可用 │
│ 主从:数据备份,但故障需手动切换 │
│ 哨兵:自动故障转移,但单点写入瓶颈 │
│ Cluster:分布式存储,高可用+高性能 │
└─────────────────────────────────────────────────────────────┘
1.2 架构对比
| 架构 | 高可用 | 数据分片 | 扩展性 | 复杂度 |
|---|---|---|---|---|
| 单机 | ❌ | ❌ | ❌ | 低 |
| 主从 | 部分 | ❌ | ❌ | 低 |
| 哨兵 | ✅ | ❌ | ❌ | 中 |
| Cluster | ✅ | ✅ | ✅ | 高 |
二、主从复制
2.1 复制原理
┌─────────┐ ┌─────────┐
│ Master │ ──── 同步数据 ────► │ Slave │
│ (写) │ │ (读) │
└─────────┘ └─────────┘
│
└──────────────────────────► ┌─────────┐
│ Slave │
└─────────┘
2.2 配置步骤
bash
# Master 配置
bind 0.0.0.0
port 6379
daemonize yes
# Slave 配置
replicaof 192.168.1.100 6379
replica-read-only yes
三、哨兵模式
3.1 架构图
┌─────────────────────────────────────────────────────────────┐
│ Sentinel 集群 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │Sentinel1│ │Sentinel2│ │Sentinel3│ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
└─────────┼──────────────┼──────────────┼─────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐
│ Master │ ─────复制──────► │ Slave │
└─────────┘ └─────────┘
3.2 配置示例
conf
# sentinel.conf
port 26379
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
3.3 故障转移流程
1. Sentinel 检测到 Master 下线
2. Sentinel 选举领头 Sentinel
3. 领头 Sentinel 选举新 Master
4. 其他 Slave 复制新 Master
5. 客户端更新连接信息
四、Cluster 模式
4.1 架构图
┌─────────────────────────────────────────────────────────────┐
│ Redis Cluster │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Master1 │ │ Master2 │ │ Master3 │ │
│ │ 槽0-5460│ │槽5461-10922│ │槽10923-16383│ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐ │
│ │ Slave1 │ │ Slave2 │ │ Slave3 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────┘
4.2 槽位分配
Redis Cluster 有 16384 个槽位
每个 Master 负责一部分槽位
key 的槽位计算:CRC16(key) % 16384
4.3 配置示例
bash
# 创建集群
redis-cli --cluster create \
192.168.1.100:6379 \
192.168.1.101:6379 \
192.168.1.102:6379 \
192.168.1.103:6379 \
192.168.1.104:6379 \
192.168.1.105:6379 \
--cluster-replicas 1
4.4 Java 客户端
java
@Configuration
public class RedisClusterConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisClusterConfiguration config = new RedisClusterConfiguration(
Arrays.asList(
"192.168.1.100:6379",
"192.168.1.101:6379",
"192.168.1.102:6379"
)
);
config.setPassword("password");
return new LettuceConnectionFactory(config);
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
五、性能优化
5.1 内存优化
conf
# redis.conf
maxmemory 4gb
maxmemory-policy allkeys-lru
# 数据结构优化
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
set-max-intset-entries 512
zset-max-ziplist-entries 128
5.2 网络优化
conf
# redis.conf
tcp-backlog 511
tcp-keepalive 300
# 客户端连接池
spring:
redis:
lettuce:
pool:
max-active: 100
max-idle: 50
min-idle: 10
5.3 持久化优化
conf
# RDB 优化
save 900 1
save 300 10
save 60 10000
rdbcompression yes
# AOF 优化
appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite no
5.4 大 Key 优化
java
// 避免 Big Key
// 差:单个大 Hash
HSET big:key field1 value1 ... field10000 value10000
// 好:拆分多个小 Hash
HSET small:key:1 field1 value1 ... field100 value100
HSET small:key:2 field101 value101 ... field200 value200
// 使用 Pipeline 批量操作
public void batchSet(Map<String, String> data) {
redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
data.forEach((key, value) -> {
connection.set(key.getBytes(), value.getBytes());
});
return null;
});
}
总结
✅ 集群架构 :演进历程、架构对比
✅ 主从复制 :原理、配置
✅ 哨兵模式 :故障转移
✅ Cluster 模式 :分布式存储
✅ 性能优化:内存、网络、持久化
本系列完结
作者 :刘~浪地球
系列 :数据库与缓存(三)
更新时间:2026-04-11