Redis 不同架构搭建实践指南

1 环境准备

1.1 系统要求

  • 操作系统:Linux (推荐 Ubuntu 20.04+ 或 CentOS 7+)
  • 内存:至少 2GB
  • Redis 版本:6.x 或 7.x

1.2 安装 Redis

Ubuntu/Debian 系统

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 更新包管理器
sudo apt update

# 安装 Redis
sudo apt install redis-server -y

# 或者从源码编译最新版本
wget https://download.redis.io/redis-stable.tar.gz
tar -xzf redis-stable.tar.gz
cd redis-stable
make
sudo make install

CentOS/RHEL 系统

1
2
3
4
5
6
7
8
# 安装 EPEL 仓库
sudo yum install epel-release -y

# 安装 Redis
sudo yum install redis -y

# 或使用 dnf (CentOS 8+)
sudo dnf install redis -y

macOS 系统

1
2
3
4
5
# 使用 Homebrew 安装
brew install redis

# 或者使用 MacPorts
sudo port install redis

1.3 Redis 安装验证和故障排除

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 创建 Redis 安装检查脚本
cat > ~/redis-practice/check-redis-installation.sh << 'EOF'
#!/bin/bash

echo "=== Redis 安装状态检查 ==="

# 检查 redis-server
if command -v redis-server >/dev/null 2>&1; then
    echo "✅ redis-server 已安装: $(which redis-server)"
    redis-server --version
else
    echo "❌ redis-server 未找到"
    REDIS_MISSING=1
fi

# 检查 redis-cli
if command -v redis-cli >/dev/null 2>&1; then
    echo "✅ redis-cli 已安装: $(which redis-cli)"
else
    echo "❌ redis-cli 未找到"
    REDIS_MISSING=1
fi

# 检查 redis-sentinel
if command -v redis-sentinel >/dev/null 2>&1; then
    echo "✅ redis-sentinel 已安装: $(which redis-sentinel)"
else
    echo "⚠️  redis-sentinel 未找到,将使用 redis-server --sentinel 模式"
    if command -v redis-server >/dev/null 2>&1; then
        echo "✅ 可以使用 redis-server --sentinel 启动哨兵"
    else
        REDIS_MISSING=1
    fi
fi

if [ "$REDIS_MISSING" = "1" ]; then
    echo ""
    echo "❌ Redis 未正确安装,请选择以下安装方式:"
    echo ""
    echo "Ubuntu/Debian:"
    echo "  sudo apt update && sudo apt install redis-server -y"
    echo ""
    echo "CentOS/RHEL:"
    echo "  sudo yum install epel-release -y && sudo yum install redis -y"
    echo ""
    echo "macOS:"
    echo "  brew install redis"
    echo ""
    echo "从源码编译:"
    echo "  wget https://download.redis.io/redis-stable.tar.gz"
    echo "  tar -xzf redis-stable.tar.gz"
    echo "  cd redis-stable && make && sudo make install"
    echo ""
    exit 1
else
    echo ""
    echo "✅ Redis 安装检查完成,可以开始架构搭建实践"
fi
EOF

chmod +x ~/redis-practice/check-redis-installation.sh

# 运行安装检查
~/redis-practice/check-redis-installation.sh

1.4 创建工作目录

1
2
3
mkdir -p ~/redis-practice
cd ~/redis-practice
mkdir -p {master-slave,cluster,sentinel}/{conf,data,logs}

1.5 Redis 版本兼容性检查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 创建版本兼容性检查脚本
cat > ~/redis-practice/check-redis-version.sh << 'EOF'
#!/bin/bash

echo "=== Redis 版本检查 ==="
REDIS_VERSION=$(redis-server --version | grep -oE "[0-9]+\.[0-9]+" | head -1)
echo "检测到 Redis 版本: $REDIS_VERSION"

MAJOR_VERSION=$(echo $REDIS_VERSION | cut -d. -f1)
MINOR_VERSION=$(echo $REDIS_VERSION | cut -d. -f2)

echo "主版本号: $MAJOR_VERSION, 次版本号: $MINOR_VERSION"

if [ $MAJOR_VERSION -ge 5 ]; then
    echo "✅ Redis 5.0+ 版本,支持 replica-* 指令"
    echo "建议使用: replicaof, replica-serve-stale-data, replica-read-only"
else
    echo "⚠️  Redis 4.x 版本,需要使用 slave-* 指令"
    echo "必须使用: slaveof, slave-serve-stale-data, slave-read-only"
fi

echo ""
echo "当前指南已针对 Redis 4.x 兼容性进行配置"
echo "如果您使用 Redis 5.0+,配置文件仍然有效(向后兼容)"
EOF

chmod +x ~/redis-practice/check-redis-version.sh

# 运行版本检查
~/redis-practice/check-redis-version.sh

2 主从复制架构 (Master-Slave)

2.1 架构说明

  • 1个主节点 (Master):负责写操作
  • 2个从节点 (Slave):负责读操作,从主节点同步数据

2.2 配置文件准备

主节点配置 (redis-master.conf)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
cat > ~/redis-practice/master-slave/conf/redis-master.conf << 'EOF'
# 基本配置
port 6379
bind 0.0.0.0
protected-mode no

# 数据持久化
dir /home/$(whoami)/redis-practice/master-slave/data/master
dbfilename dump-master.rdb
appendonly yes
appendfilename "appendonly-master.aof"

# 日志配置
logfile /home/$(whoami)/redis-practice/master-slave/logs/redis-master.log
loglevel notice

# 主从复制配置
# 允许从节点连接 (Redis 5.0+ 使用 replica-*, 4.0 使用 slave-*)
replica-serve-stale-data yes
replica-read-only yes

# 安全配置
requirepass redis123
masterauth redis123

# 性能优化
maxmemory 256mb
maxmemory-policy allkeys-lru
EOF

从节点1配置 (redis-slave1.conf)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
cat > ~/redis-practice/master-slave/conf/redis-slave1.conf << 'EOF'
# 基本配置
port 6380
bind 0.0.0.0
protected-mode no

# 数据持久化
dir /home/$(whoami)/redis-practice/master-slave/data/slave1
dbfilename dump-slave1.rdb
appendonly yes
appendfilename "appendonly-slave1.aof"

# 日志配置
logfile /home/$(whoami)/redis-practice/master-slave/logs/redis-slave1.log
loglevel notice

# 主从复制配置
replicaof 127.0.0.1 6379
replica-serve-stale-data yes
replica-read-only yes

# 安全配置
requirepass redis123
masterauth redis123

# 性能优化
maxmemory 256mb
maxmemory-policy allkeys-lru
EOF

从节点2配置 (redis-slave2.conf)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
cat > ~/redis-practice/master-slave/conf/redis-slave2.conf << 'EOF'
# 基本配置
port 6381
bind 0.0.0.0
protected-mode no

# 数据持久化
dir /home/$(whoami)/redis-practice/master-slave/data/slave2
dbfilename dump-slave2.rdb
appendonly yes
appendfilename "appendonly-slave2.aof"

# 日志配置
logfile /home/$(whoami)/redis-practice/master-slave/logs/redis-slave2.log
loglevel notice

# 主从复制配置
replicaof 127.0.0.1 6379
replica-serve-stale-data yes
replica-read-only yes

# 安全配置
requirepass redis123
masterauth redis123

# 性能优化
maxmemory 256mb
maxmemory-policy allkeys-lru
EOF

2.3 关键命令详解

在使用脚本之前,让我们先了解主从复制的核心命令:

空行在代码中的重要性

空行在代码开发中非常重要,日常代码复核中发现经常遇到一些代码堆在一起的情况,十分影响代码的可读性。代码不仅要让机器跑得通,更要让人类读得懂。

下面举一些 Python 的例子进行说明:

MongoDB 删除数据方案

我们在日常运营中会积累大量的数据,有时候需要把这些数据归档。

对于MongoDB来说,如果要快速删除大量数据,这里有几种方法可以考虑:

1 deleteMany() - 基础方案

1
2
3
4
5
6
7
8
// 基本用法
db.collection.deleteMany({ status: "inactive" })

// 带条件删除
db.collection.deleteMany({ 
  createdAt: { $lt: new Date("2023-01-01") },
  status: { $in: ["deleted", "expired"] }
})

优点: