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 个哨兵节点),实现自动故障转移

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

相关推荐
2503_930123936 小时前
Redis群集的三种模式详解
数据库·redis·缓存
云和数据.ChenGuang6 小时前
openEuler 上安装与部署 Redis 的完整技术教程
数据库·redis·缓存
关于不上作者榜就原神启动那件事7 小时前
Redis学习文档
数据库·redis·学习
是萝卜干呀8 小时前
Redis
数据库·redis·缓存
妮妮喔妮9 小时前
redis热点key拆分和读多副本
数据库·redis·缓存
小雨下雨的雨9 小时前
第8篇:Redis缓存设计与缓存问题
java·redis·缓存
LeeZhao@9 小时前
【狂飙全模态】狂飙AGI-智能视频生成助手
人工智能·redis·语言模型·音视频·agi
qq_348231859 小时前
Redis 事务(MULTI/EXEC)与 Lua 脚本的核心区别
数据库·redis·lua
摇滚侠9 小时前
分布式锁,etcd,redis,ZooKeeper
redis·分布式·etcd