数据库与缓存--Redis 集群架构与优化

系列导读:本篇将深入讲解 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

相关推荐
这个DBA有点耶8 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
这个DBA有点耶10 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技11 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend11 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence15 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung1 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql