数据库与缓存--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

相关推荐
KmSH8umpK13 分钟前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第五篇
数据库·redis·分布式
lilihuigz17 分钟前
企业培训网站搭建指南:5步在WordPress上创建品牌学院
数据库
WL_Aurora25 分钟前
MySQL 5 卸载到 MySQL 8 安装完整指南(不踩坑版)
数据库·mysql
灰阳阳28 分钟前
MySQL的基本架构
数据库·mysql·架构
AI进化营-智能译站1 小时前
ROS2 C++开发系列08-传感器数据缓存与指令解析方式之数组、向量与字符串实战
开发语言·c++·缓存·ai
@小柯555m1 小时前
MySql(高级操作符--Where in 和Not in)
数据库·sql·mysql
许彰午1 小时前
CacheSQL(一):手写数据库的工程化重生
java·数据库·缓存
MmeD UCIZ1 小时前
MySQL单表存多大的数据量比较合适
数据库·mysql
SarL EMEN1 小时前
mysql之联合索引
数据库·mysql
l1t1 小时前
DeepSeek总结的DuckDB anofox-forecast季节调整时间序列预测插件功能
开发语言·数据库