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

相关推荐
Mr.朱鹏6 小时前
Linux 服务器 LVM 根分区在线动态扩容
linux·服务器·数据库
摇滚侠6 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 数据库初始化机制 阅读笔记 36
数据库·spring boot·笔记
qiuhaipeng16 小时前
Claude code 升级后上下文长度变短问题
java·前端·数据库
wxwx_bscxy3227 小时前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
剑之所向8 小时前
.NET 官方`System.Threading.Channels`
前端·javascript·数据库
词却8 小时前
数据库基础:DQL 数据查询语言
数据库·oracle
昌原的儿子LEO10 小时前
Linux IO多路复用与SQLite数据库核心知识点总结
linux·数据库·oracle
山岚的运维笔记11 小时前
mysql 专业笔记 -- 第 8 章:使用变量
运维·数据库·笔记·后端·学习·mysql·dba
聚美智数11 小时前
网安查询-备案查询-网络安全查询API接口介绍
网络·数据库·web安全
坐吃山猪11 小时前
【多线程】Semaphore使用
java·数据库·oracle·多线程