Redis 分区(Partitioning)全攻略(2025 版)
核心目标 :水平扩展 ,突破单机 内存、CPU、网络 瓶颈,实现 高可用 + 高性能 。
1. 什么是 Redis 分区?
项目 说明 定义 将数据 拆分到多个 Redis 实例 ,每个实例负责一部分 key 目的 解决 单机内存上限(64GB+) 、单核 CPU 瓶颈 、网络带宽饱和 类型 客户端分片 、代理分片 、Redis Cluster(官方集群)
2. 三种分区方式对比(2025 推荐 )
方式 架构 优点 缺点 适用场景 客户端分片 应用直连多实例 性能最高、无中间件 客户端复杂、运维难 小型团队、自研 代理分片 Twemproxy / Redis Proxy 客户端透明、易迁移 单点、性能损耗 中型项目 Redis Cluster 官方集群(内置分片) 高可用、自动故障转移、动态扩缩容 复杂、多 key 操作受限 生产首选
2025 推荐 :Redis Cluster (7.2+ 版本成熟稳定)
3. Redis Cluster 深度解析
3.1 核心概念
概念 说明 16384 个槽(Slot) key → CRC16(key) % 16384 映射到槽 主从复制 每个槽有 1 主 + N 从 故障转移 从节点自动晋升 Gossip 协议 节点间心跳,状态同步 Cluster Bus 端口 +10000(16379)用于集群通信
[Node A:7000] slots: 0-5460 (Master)
[Node B:7001] slots: 5461-10922 (Master)
[Node C:7002] slots: 10923-16383(Master)
[Node D:7003] replica of A
[Node E:7004] replica of B
[Node F:7005] replica of C
3.2 搭建 Redis Cluster(6 节点示例)
步骤 1:配置文件(redis-7000.conf)
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
bind 0.0.0.0
protected-mode no
复制 7000~7005 共 6 份,修改 port
步骤 2:启动所有节点
for i in {7000..7005}; do
redis-server redis-$i.conf
done
步骤 3:创建集群(Redis 5+ 一键)
redis-cli --cluster create \
127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
输出:
>>> Performing hash slots allocation on 6 nodes...
M: node1 127.0.0.1:7000 slots:0-5460
M: node2 127.0.0.1:7001 slots:5461-10922
...
Can I set the above configuration? (type 'yes' to accept): yes
3.3 动态扩容(在线添加节点)
# 1. 启动新节点(7006 主,7007 从)
redis-server redis-7006.conf
redis-server redis-7007.conf
# 2. 加入集群
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000
# 3. 设置 7007 为 7006 的从节点
redis-cli -p 7007 cluster replicate <node-id-of-7006>
# 4. 重新分片(迁移槽)
redis-cli --cluster reshard 127.0.0.1:7000
# 输入:要迁移的槽数(如 4096),源节点(all),目标节点(7006 的 node-id)
3.4 客户端连接 Cluster
Java(Lettuce)
Set<RedisURI> nodes = Stream.of(7000,7001,7002,7003,7004,7005)
.map(p -> RedisURI.create("redis://127.0.0.1:" + p))
.collect(Collectors.toSet());
RedisClusterClient client = RedisClusterClient.create(nodes);
StatefulRedisClusterConnection<String, String> conn = client.connect();
conn.sync().set("key", "value"); // 自动路由
Python(redis-py-cluster)
from rediscluster import RedisCluster
nodes = [{"host": "127.0.0.1", "port": p} for p in range(7000, 7006)]
rc = RedisCluster(startup_nodes=nodes, decode_responses=True)
rc.set("key", "value")
4. 分区策略:key 分配最佳实践
策略 示例 说明 哈希标签(Hash Tag) {user:1000}:profile强制同槽 前缀分片 user:1000:info, user:1000:stats用 {user:1000} 包裹 批量操作 MGET key1 key2必须同槽 ,否则报 CROSSSLOT避免热点 key 不要所有 key 都用 {hot} 均匀分布
# 计算 key 所属槽
redis-cli CLUSTER KEYSLOT "{user:123}:profile"
# → 返回槽号
5. 多 key 操作限制与解决方案
操作 是否支持 解决方案 MGET key1 key2仅同槽 使用 Hash Tag SUNION set:a set:b仅同槽 客户端合并 DEL key1 key2仅同槽 Pipeline + Hash Tag SCAN支持 自动跨节点
6. 性能与容量规划
指标 单节点 6 节点 Cluster 内存 64GB 384GB QPS 10W 60W+ 故障影响 全挂 仅 1/3 数据不可用
R edis 7+ IO 线程 :每个节点 io-threads 4 → QPS 再提升 50%
7. 监控与运维
7.1 关键命令
redis-cli --cluster check 127.0.0.1:7000 # 集群健康
redis-cli CLUSTER INFO # 状态概览
redis-cli CLUSTER NODES # 节点详情
redis-cli INFO replication # 主从状态
7.2 监控指标
# Prometheus + redis_exporter
redis_cluster_slots_assigned
redis_cluster_slots_ok
redis_cluster_state # 1=ok, 0=fail
redis_connected_clients
8. 常见问题与坑
问题 原因 解决方案 CROSSSLOT Keys in request don't hash to the same slot多 key 不同槽 使用 {} Hash Tag 扩容后数据不均衡 槽迁移未完成 redis-cli --cluster fix从库延迟高 网络/磁盘 开启 repl-diskless-sync yes 集群状态 fail 超过半数主节点失联 确保节点 > 3,网络稳定 客户端连接失败 未使用 Cluster 客户端 改用 RedisClusterClient
9. 一键部署脚本(Docker Compose)
# docker-compose.yml
version: '3.8'
services:
redis-7000:
image: redis:7.2
command: redis-server /usr/local/etc/redis/redis.conf
volumes:
- ./conf/7000.conf:/usr/local/etc/redis/redis.conf
ports: ["7000:7000", "17000:17000"]
# ... 7001~7005 类似
# 启动后创建集群
docker exec -it redis-7000 redis-cli --cluster create \
$(docker ps -q --filter "name=redis" | xargs -I {} echo 172.17.0.1:{} | tr '\n' ' ') \
--cluster-replicas 1
10. 最佳实践清单(Checklist)
项目 检查 使用 Redis Cluster 官方推荐 至少 3 主 + 3 从 高可用 所有 key 使用 Hash Tag 多 key 操作 客户端使用 Cluster 模式 自动路由 定期 CLUSTER CHECK 健康检测 备份每个节点 RDB/AOF 灾难恢复 监控 cluster_state 告警 扩容前测试 reshard 验证流程
小结:分区选型决策树
graph TD
A[数据量 > 50GB?] -->|是| B[需要高可用?]
B -->|是| C[使用 Redis Cluster]
B -->|否| D[客户端分片]
A -->|否| E[单机 Redis 即可]
彩蛋:Redis 8+ 新特性(2025)
动态槽迁移 :CLUSTER SETSLOT ... MIGRATING/IMPORTING 支持零停机
Cluster Proxy :官方代理,替代 Twemproxy
自动故障转移优化 :毫秒级探测
需要 K8s StatefulSet 部署 Cluster 、Terraform 自动化扩缩容 、跨可用区分片 或 分片迁移零停机方案 ?随时告诉我!