Redis 基础原理、持久化、主从复制与哨兵模式

一、Redis 是什么?

1. 核心定位

Redis(Remote Dictionary Server)是一款开源、C语言编写的内存/缓存型非关系型数据库(NoSQL),支持存储非结构化数据(如字符串、列表、哈希等),核心定位是"高性能缓存+数据存储"。

2. 核心特性

高性能:读取速度达 110000 次/s,写入速度达 81000 次/s

数据结构丰富:支持 string(字符串)、list(列表)、hash(哈希)、sets(无序集合)、sorted sets(有序集合)

原子性:单线程执行写命令,避免并发锁开销

支持持久化:可将内存数据同步到磁盘,防止数据丢失

支持主从复制、哨兵模式等集群方案,提升可用性

3. 为什么 Redis 这么快?

纯内存操作:避免磁盘 IO 的慢速开销。

单线程模型:无需上下文切换,减少并发管理开销(Redis 6.0 新增多线程仅用于处理请求接收,核心写命令仍单线程)。

IO 多路复用:同时处理多个客户端连接,提升并发处理能力。

二、Redis 怎么用?

1. 核心用途

作为"缓存中间件",存储高热数据(访问频率高、查询耗时的热点数据),减少后端数据库压力。

2. 典型场景

秒杀活动:库存扣减、订单写入优先走 Redis,避免 MySQL 并发过载

实时榜单:用 sorted set 存储关键词+热度值,实现抖音热搜榜、商品销量榜等实时排序

数据缓存:用户信息、商品详情等高频查询数据,缓存后直接从 Redis 返回,提升响应速度

三、Redis 为什么能帮 MySQL 缓冲?如何帮?

1. 为什么能帮 MySQL 缓冲?

MySQL 短板:并发能力弱,高频访问场景下易卡顿(磁盘 IO 慢、锁竞争严重)

Redis 优势:纯内存操作+高并发支持,能承接大部分高频请求,相当于"流量过滤器",减轻 MySQL 压力

2. 如何帮 MySQL 缓冲?(缓存流程)

① 客户端发起请求时,优先查询 Redis

② 若 Redis 中存在目标数据(缓存命中),直接返回数据,无需访问 MySQL

③ 若 Redis 中无数据(缓存未命中),再查询 MySQL

④ 将 MySQL 返回的结果写入 Redis 缓存,后续相同请求直接从 Redis 获取

通过该流程,Redis 拦截了大部分高频请求,避免 MySQL 被海量并发查询压垮,实现"缓冲"效果。

四、Redis 持久化:是什么、怎么做、为什么用?

1. 持久化的定义与意义(为什么用)

问题:Redis 数据默认存储在内存中,服务器宕机(断电、重启)会导致数据全部丢失。

解决方案:持久化是将内存中的数据定期/实时同步到磁盘的机制,目的是保证数据可靠性,宕机后可通过磁盘文件恢复数据,避免缓存雪崩(缓存全失后全量请求打向 MySQL)。

2. 两种持久化方案(怎么做)

方案 核心原理 触发方式 特点
RDB(Redis DataBase) 周期性生成数据快照(类似 VM 快照),将某一时刻的内存数据完整写入磁盘文件 1. 配置文件指定周期(如 900s 内改 1 次、300s 内改 10 次); 2. 手动执行 save(阻塞主进程)或 bgsave(后台异步执行)命令 优点:文件体积小、恢复速度快; 缺点:数据一致性差(可能丢失周期内的新数据)
AOF(Append Only File) 实时记录每一条写/删除命令(查询命令不记录),Redis 重启时重新执行命令恢复数据 1. 配置文件开启 appendonly yes; 2. 同步策略:每秒同步(默认)、每写一条同步、不主动同步 优点:数据一致性强(实时性好),主流方案; 缺点:文件体积大、恢复速度较慢

3. 核心区别

AOF 实时性优于 RDB,数据丢失风险更低,是生产环境首选。

RDB 适合数据备份、全量恢复场景,可与 AOF 配合使用(双重保障)。

五、Redis 主从复制怎么实现?

1. 核心目的

数据备份:从节点(Slave)复制主节点(Master)数据,避免单节点数据丢失;

负载均衡:读请求分流到从节点,主节点专注处理写请求,提升整体并发能力。

2. 核心原理

从节点主动向主节点发起同步请求,主节点通过 RDB 持久化生成数据快照,结合增量命令(同步期间的新数据操作),将完整数据同步到从节点,后续主节点的写操作会实时同步给从节点。

3. 同步流程(重点)

① Slave 启动后,向 Master 发送 sync command 同步请求

② Master 启动后台进程执行 RDB 持久化(生成数据快照),同时缓存同步期间的所有写命令

③ Master 完成 RDB 后,将 RDB 文件发送给 Slave

④ Slave 接收 RDB 文件,保存到磁盘并加载到内存

⑤ Master 再将缓存的写命令发送给 Slave,Slave 执行命令完成增量同步

⑥ 后续 Master 新增写操作,会实时同步给所有 Slave;若 Slave 宕机恢复后,会自动重新连接同步。

4. 搭建关键步骤(基于 Redis 5.0.7)

(1)环境准备

节点规划:Master(192.168.10.130)、Slave1(192.168.10.131)、Slave2(192.168.10.132);

基础操作:关闭防火墙(systemctl stop firewalld)、禁用 SELinux(setenforce 0)。

(2)安装 Redis(所有节点)
Bash 复制代码
# 安装依赖
yum install -y gcc gcc-c++ make
# 下载并解压
wget -p /opt http://download.redis.io/releases/redis-5.0.7.tar.gz
tar zxvf redis-5.0.7.tar.gz -C /opt/
# 编译安装
cd /opt/redis-5.0.7/
make && make PREFIX=/usr/local/redis install
# 配置环境变量
ln -s /usr/local/redis/bin/* /usr/local/bin/
(3)Master 节点配置(/etc/redis/6379.conf)
Bash 复制代码
vim /etc/redis/6379.conf
bind 0.0.0.0						#70行,修改监听地址为0.0.0.0
daemonize yes						#137行,开启守护进程
logfile /var/log/redis_6379.log		#172行,指定日志文件目录
dir /var/lib/redis/6379				#264行,指定工作目录
appendonly yes						#700行,开启AOF持久化功能

# 重启生效
/etc/init.d/redis_6379 restart
(4)Slave 节点配置(/etc/redis/6379.conf)
Bash 复制代码
vim /etc/redis/6379.conf
bind 0.0.0.0						#70行,修改监听地址为0.0.0.0
daemonize yes						#137行,开启守护进程
logfile /var/log/redis_6379.log		#172行,指定日志文件目录
dir /var/lib/redis/6379				#264行,指定工作目录		

#288行,指定要同步的Master节点IP和端口
replicaof 192.168.10.130 6379
appendonly yes						#700行,开启AOF持久化功能

/etc/init.d/redis_6379 restart
(5)验证主从效果
Bash 复制代码
在Master节点上看日志:
tail -f /var/log/redis_6379.log 
Replica 192.168.10.131:6379 asks for synchronization
Replica 192.168.10.132:6379 asks for synchronization

在Master节点上验证从节点:
redis-cli info replication

# Replication
role:master
connected_slaves:2
slave0:ip=192.168.10.18,port=6379,state=online,offset=1246,lag=0
slave1:ip=192.168.10.19,port=6379,state=online,offset=1246,lag=1

六、Redis 哨兵模式

1. 哨兵模式的定义(解决什么问题)

主从复制的痛点:主节点宕机后,需手动将 Slave 切换为 Master,耗时费力且导致服务短暂不可用。

哨兵模式(Sentinel)是基于主从复制的高可用解决方案,核心是"自动故障转移",无需人工干预即可实现主节点故障后的集群自愈。

2. 核心原理

哨兵是一个分布式系统,由 3个以上奇数哨兵节点(特殊 Redis 节点,不存储数据)组成,通过以下机制保障高可用:

监控:哨兵节点定期检测主从节点的存活状态

投票判定:当主节点故障时,超过半数哨兵节点达成共识(客观下线),触发故障转移

选举新主:通过 Raft 算法选举 1 个哨兵节点作为 Leader,由其执行故障转移操作

3. 核心作用

监控:每隔 1 秒向主从节点、其他哨兵节点发送 Ping 命令,检测节点健康状态

自动故障转移:主节点故障后,自动将最优 Slave 升级为新主,其他 Slave 同步新主数据,原主恢复后转为 Slave

通知:将故障转移结果(新主节点地址)发送给客户端,确保客户端正常访问

4. 故障转移机制(重点)

故障检测:哨兵节点每秒 Ping 主节点,若主节点在指定时间(默认 30 秒)内未响应或回复错误,该哨兵判定主节点"主观下线"

客观下线:当超过半数哨兵节点均判定主节点主观下线,即达成共识,主节点"客观下线"

选举 Leader 哨兵:所有哨兵通过 Raft 算法选举 1 个 Leader,负责执行故障转移

执行转移

​ (1) 筛选最优 Slave(健康、优先级最高、复制最完整)升级为新主

​ (2) 通知其他 Slave 同步新主数据

​ (3) 原主节点恢复后,自动转为新主的 Slave

​ (4) 通知客户端更新主节点地址

5. 新主节点选举规则

① 过滤不健康(未响应 Ping、已下线)的 Slave;

② 选择配置文件中优先级最高的 Slave(replica-priority,默认 100,值越小优先级越高);

③ 选择复制偏移量最大的 Slave(即同步主数据最完整的 Slave)。

6. 搭建关键步骤(基于 Redis 5.0.7)

(1)前置条件

已完成主从复制搭建(Master:192.168.10.130,Slave1:192.168.10.131,Slave2:192.168.10.132)。

(2)所有节点修改哨兵配置文件(/opt/redis-5.0.7/sentinel.conf)
复制代码
vim /opt/redis-5.0.7/sentinel.conf
protected-mode no                # 17行,关闭保护模式
port 26379                       # 21行,哨兵默认监听端口
daemonize yes                    # 26行,后台启动
logfile "/var/log/sentinel.log"  # 36行,日志路径
dir "/var/lib/redis/6379"        # 65行,数据存储路径
# 84行,监控主节点(名称mymaster,IP+端口,需2个哨兵同意判定故障)
sentinel monitor mymaster 192.168.10.130 6379 2
sentinel down-after-milliseconds mymaster 30000  # 113行,30秒未响应判定下线
sentinel failover-timeout mymaster 180000        # 146行,故障转移超时时间180秒
(3)启动哨兵模式(先启 Master,再启 Slave)
复制代码
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &  # 后台启动哨兵
(4)验证哨兵状态
复制代码
redis-cli -p 26379 info Sentinel
(5)故障模拟与验证
复制代码
# 1. 查看 Master 节点 redis-server 进程号
ps -ef | grep redis
# 2. 杀死 Master 进程(模拟主节点故障)
kill -9 7394(Master 进程号)
# 3. 查看哨兵日志,确认故障转移
tail -f /var/log/sentinel.log
# 4. 验证新主节点
redis-cli -p 26379 info Sentinel
# 预期输出:master0:address=192.168.10.131:6379(已切换为 Slave1)

七、整体总结

1. Redis 核心价值

Redis 作为"高性能内存缓存+NoSQL 数据库",核心解决了 MySQL 并发能力弱、响应慢的痛点,通过缓存高热数据实现"减压提速",同时通过持久化、主从复制、哨兵模式保障数据可靠性和集群高可用。

2. 关键组件逻辑关联

持久化:解决"内存数据易丢失"问题,是数据可靠的基础(RDB 备份+AOF 实时同步)

主从复制:解决"单节点负载高"问题,实现数据备份+读负载分流,是哨兵模式的前提

哨兵模式:解决"主从复制手动故障转移"问题,实现集群高可用,让 Redis 具备生产环境部署能力

3. 核心流程闭环

客户端请求 → Redis 缓存命中→ 直接返回;未命中→ 查询 MySQL→ 结果写入 Redis→ 后续复用

集群层面:主节点写数据→ 同步至 Slave→ 哨兵监控节点状态→ 主节点故障自动切换→ 服务无感知

4. 生产环境核心方案

缓存策略:Redis 缓存高热数据,减轻 MySQL 压力

数据可靠:开启 AOF 持久化+定期 RDB 备份

高可用:主从复制(1 主 N 从)+ 哨兵模式(≥3 个哨兵节点),实现自动故障转移

核心目标:高性能、高可用、数据可靠

相关推荐
二宝哥18 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
ShiXZ2131 天前
Redis docker-compose 部署指南
redis·docker·eureka
青山木1 天前
Redis 缓存一致性全解:从 Cache Aside 到延迟双删、Canal+MQ 的进阶之路
java·数据库·redis·后端·缓存
YDS8291 天前
大营销平台 —— 活动SKU库存扣减业务及其一致性处理
java·spring boot·redis·rabbitmq·ddd
爬也要爬着前进2 天前
redis主从搭建
数据库·redis·缓存
用户095367515832 天前
在系统的学习 redis 前的疑惑
redis·go
吴声子夜歌2 天前
Redis 3.x——集群故障转移
java·数据库·redis·集群
明豆2 天前
Redis 分布式缓存生产实战
redis·分布式·缓存
海兰2 天前
【高速缓存】RedisVL 指南:从向量搜索到 AI 应用落地
人工智能·redis
weixin_727535622 天前
双Token认证体系深度拆解:Spring Security + JWT + Redis
redis·spring·wpf