Redis 从入门到实战:安装 / 数据类型 / 持久化 / 主从哨兵集群 全攻略
前言
Redis 是一款开源的、基于内存的、支持多种数据结构的键值对(Key-Value)存储系统,常被称为"缓存之王"或"数据结构的服务器"。它凭借极快的读写性能、丰富的数据类型、强大的持久化和高可用机制,成为后端开发与运维的必备技能。
本文系统讲解 Redis 的核心知识:简介特性 → 安装与基本使用 → 五大数据类型 → 常用命令 → 持久化(RDB/AOF)→ 主从复制 → 哨兵 → 集群,帮助你在 CSDN 一站式掌握 Redis。
第 1 章 Redis 简介与特性
1.1 什么是 Redis
Redis 全称 REmote DIctionary Server(远程字典服务器),由意大利人 Salvatore Sanfilippo(antirez)于 2009 年开发,以 C 语言编写。
它是一种基于内存 的数据库,数据默认存储在内存中,因此读写速度极快(可达每秒 10 万+ 次读、10 万+ 次写),通常作为缓存使用,也可以作为轻量级数据库或消息队列使用。
1.2 Redis 的核心特性
| 特性 | 说明 |
|---|---|
| 基于内存 | 数据在内存中,读写极快 |
| 多种数据结构 | 支持 String、Hash、List、Set、Sorted Set 等 |
| 单线程模型 | 单线程执行命令,天然避免并发竞争,操作原子 |
| 支持持久化 | RDB 快照 + AOF 日志,重启可恢复数据 |
| 高可用 | 支持主从复制、哨兵(Sentinel)、集群(Cluster) |
| 支持过期键 | 可为键设置 TTL,自动删除过期数据 |
| 发布订阅 | 支持 PUBLISH / SUBSCRIBE 消息通信 |
| 事务 | 支持 MULTI / EXEC 简单事务 |
1.3 Redis 与 Memcached 对比
| 对比项 | Redis | Memcached |
|---|---|---|
| 数据结构 | 多种(String/Hash/List/Set 等) | 仅 Key-Value 字符串 |
| 持久化 | 支持(RDB/AOF) | 不支持 |
| 数据类型扩展 | 丰富 | 单一 |
| 集群/高可用 | 支持哨兵、集群 | 依靠客户端分片 |
| 适用场景 | 缓存、队列、计数器等 | 纯缓存场景 |
1.4 Redis 版本演进
| 版本 | 主要特性 |
|---|---|
| Redis 3.0 | 引入 Redis Cluster 集群 |
| Redis 4.0 | 引入模块系统、混合持久化 |
| Redis 5.0 | 引入 Stream(流)数据结构 |
| Redis 6.0 | 引入多线程 IO、RESP3 协议、ACL 访问控制 |
| Redis 7.0 | 引入多 AOF 文件、函数、ACL 增强 |
第 2 章 Redis 安装与基本使用
2.1 安装 Redis(编译安装,以 CentOS 为例)
bash
# 1. 安装依赖
yum install -y gcc gcc-c++ make wget tar
# 2. 下载源码包(以 6.2 为例)
wget https://download.redis.io/releases/redis-6.2.13.tar.gz
# 3. 解压并进入目录
tar -zxf redis-6.2.13.tar.gz
cd redis-6.2.13
# 4. 编译并安装
make
make install
# 5. 查看版本
redis-server --version
redis-cli --version
2.2 配置 Redis
bash
# 复制配置文件到指定目录
mkdir -p /etc/redis
cp redis.conf /etc/redis/redis.conf
# 修改核心配置
vim /etc/redis/redis.conf
# 后台运行
# daemonize yes
# 绑定地址(改为允许远程访问)
# bind 0.0.0.0
# 关闭保护模式
# protected-mode no
# 设置密码
# requirepass 123456
# 端口(默认 6379)
# port 6379
2.3 启动与关闭 Redis
bash
# 前台启动(会占用终端)
redis-server
# 后台启动(推荐,需 daemonize yes)
redis-server /etc/redis/redis.conf
# 检查进程
ps -ef | grep redis
# 关闭(连接客户端后执行 shutdown)
redis-cli shutdown
# 或指定端口/密码关闭
redis-cli -p 6379 -a 123456 shutdown
2.4 进入 Redis 客户端
bash
# 本机连接
redis-cli
# 指定端口、密码、远程主机连接
redis-cli -h 192.168.108.10 -p 6379 -a 123456
# 测试连通性
127.0.0.1:6379> ping
# PONG
# 切换数据库(默认 16 个库,编号 0-15)
127.0.0.1:6379> select 1
127.0.0.1:6379[1]>
# 退出
127.0.0.1:6379> quit
2.5 redis-cli 常用选项
| 选项 | 说明 |
|---|---|
-h |
指定主机地址 |
-p |
指定端口(默认 6379) |
-a |
指定密码 |
-n |
指定数据库编号 |
-r |
重复执行命令次数 |
-i |
间隔执行时间 |
第 3 章 Redis 五大数据类型
Redis 最核心的价值是它丰富的数据结构。下面逐一讲解 String、Hash、List、Set、Sorted Set(ZSet)。
3.1 String(字符串)
String 是最基本的类型,一个 Key 对应一个 Value,最大 512MB。可存字符串、数字、二进制数据。
bash
# 设置 / 获取 / 删除
127.0.0.1:6379> set name laogao
127.0.0.1:6379> get name # "laogao"
127.0.0.1:6379> del name
# 设置过期时间
127.0.0.1:6379> set token abc ex 60 # 60 秒后过期
# 数值自增 / 自减
127.0.0.1:6379> set num 10
127.0.0.1:6379> incr num # 11
127.0.0.1:6379> decr num # 10
127.0.0.1:6379> incrby num 5 # 15
# 批量设置 / 获取
127.0.0.1:6379> mset k1 v1 k2 v2
127.0.0.1:6379> mget k1 k2
典型场景: 缓存、计数器(点赞数/访问量)、Session 共享、分布式锁。
3.2 Hash(哈希)
Hash 是一个 Key 对应一个"字段-值"映射表,适合存储对象。
bash
# 设置 / 获取单个字段
127.0.0.1:6379> hset user:1 name laogao age 25
127.0.0.1:6379> hget user:1 name # "laogao"
# 批量获取 / 获取所有
127.0.0.1:6379> hmget user:1 name age
127.0.0.1:6379> hgetall user:1
# 判断字段是否存在 / 删除字段
127.0.0.1:6379> hexists user:1 name
127.0.0.1:6379> hdel user:1 age
# 获取所有字段名 / 所有值
127.0.0.1:6379> hkeys user:1
127.0.0.1:6379> hvals user:1
典型场景: 存储对象(如用户信息、商品信息),比 String 更节省内存且便于修改单个字段。
3.3 List(列表)
List 是双向链表,支持从两端插入/弹出,按插入顺序保存字符串。
bash
# 从右侧(尾部)插入
127.0.0.1:6379> rpush list a b c
# 从左侧(头部)插入
127.0.0.1:6379> lpush list x y
# 查看列表
127.0.0.1:6379> lrange list 0 -1
# 从两端弹出
127.0.0.1:6379> lpop list # 左侧弹出
127.0.0.1:6379> rpop list # 右侧弹出
# 获取长度 / 指定下标元素
127.0.0.1:6379> llen list
127.0.0.1:6379> lindex list 0
典型场景: 消息队列、最新消息列表(时间线)、日志收集。
3.4 Set(集合)
Set 是无序、元素唯一的字符串集合。
bash
# 添加元素
127.0.0.1:6379> sadd set1 a b c
# 查看集合成员
127.0.0.1:6379> smembers set1
# 判断成员是否存在
127.0.0.1:6379> sismember set1 a
# 删除成员
127.0.0.1:6379> srem set1 a
# 集合运算
127.0.0.1:6379> sadd set2 b c d
127.0.0.1:6379> sinter set1 set2 # 交集
127.0.0.1:6379> sunion set1 set2 # 并集
127.0.0.1:6379> sdiff set1 set2 # 差集
# 获取集合大小
127.0.0.1:6379> scard set1
典型场景: 去重(唯一用户/唯一 IP)、好友关系、共同关注、标签系统。
3.5 Sorted Set(有序集合,ZSet)
ZSet 在 Set 基础上给每个成员绑定一个 score(分数),按分数排序,可用于排行榜。
bash
# 添加成员及分数
127.0.0.1:6379> zadd rank 100 zhangsan 90 lisi 80 wangwu
# 按分数升序查看(0 -1 表示全部)
127.0.0.1:6379> zrange rank 0 -1 withscores
# 按分数降序查看
127.0.0.1:6379> zrevrange rank 0 -1 withscores
# 给成员加分
127.0.0.1:6379> zincrby rank 10 lisi
# 获取成员排名(0 为最高)
127.0.0.1:6379> zrank rank zhangsan
# 获取成员分数
127.0.0.1:6379> zscore rank lisi
# 删除成员
127.0.0.1:6379> zrem rank wangwu
典型场景: 排行榜(热度榜/积分榜)、延迟队列、实时分数统计。
3.6 五大类型对比总结
| 类型 | 结构 | 有序 | 唯一性 | 典型场景 |
|---|---|---|---|---|
| String | 字符串/数字 | 否 | --- | 缓存、计数器 |
| Hash | 字段-值映射 | 否 | --- | 对象存储 |
| List | 双向链表 | 是 | 否 | 消息队列、时间线 |
| Set | 无序集合 | 否 | 是 | 去重、共同关注 |
| ZSet | 有序集合 | 是(按分数) | 是 | 排行榜、延迟队列 |
第 4 章 Redis 通用命令与过期策略
4.1 通用 Key 操作命令
bash
# 查看所有 Key(生产慎用,可用 SCAN 代替)
keys *
# 判断 Key 是否存在
exists name
# 设置过期时间(秒 / 毫秒)
expire name 60
pexpire name 60000
# 查看剩余生存时间
ttl name # -1 表示永不过期,-2 表示已过期
pttl name
# 删除 Key
del name
# 清空当前库 / 清空所有库
flushdb
flushall
# 获取 Key 类型
type name
# 重命名
rename oldname newname
# 随机返回一个 Key
randomkey
4.2 数据库管理
bash
# 查看当前库 Key 数量
dbsize
# 切换数据库
select 0
# 查看服务器信息
info
info memory
info replication
# 查看当前客户端连接
client list
4.3 过期删除策略
Redis 删除过期键采用三种策略组合:
- 惰性删除:访问 Key 时才检查是否过期,过期则删除;
- 定期删除:后台周期性地抽样检查并删除过期 Key;
- 内存淘汰 :内存达到上限(
maxmemory)时,按淘汰策略(maxmemory-policy)清除 Key。
常用淘汰策略:
| 策略 | 说明 |
|---|---|
allkeys-lru |
对所有键按最近最少使用淘汰 |
volatile-lru |
对设置了过期时间的键按 LRU 淘汰 |
allkeys-random |
对所有键随机淘汰 |
volatile-random |
对有过期时间的键随机淘汰 |
volatile-ttl |
优先淘汰剩余时间最短的键 |
noeviction |
不淘汰,内存满时报错(默认) |
第 5 章 Redis 持久化(RDB 与 AOF)
Redis 基于内存,为了防止重启后数据丢失,需要持久化。Redis 提供两种机制:RDB 快照 和 AOF 日志,可单独使用,也可同时开启。
5.1 RDB(Redis DataBase)快照持久化
RDB 把某一时刻的内存数据以二进制快照 形式保存到磁盘文件(默认 dump.rdb)。
触发方式:
- 手动触发:
save(阻塞)或bgsave(后台异步); - 自动触发:按配置的保存条件(如 900 秒内 1 次修改)。
bash
# 手动保存
127.0.0.1:6379> save
127.0.0.1:6379> bgsave
# 配置文件相关项
# save 900 1 # 900 秒内至少 1 次写操作则保存
# save 300 10 # 300 秒内至少 10 次写操作则保存
# save 60 10000 # 60 秒内至少 10000 次写操作则保存
# dbfilename dump.rdb
# dir /var/lib/redis
优点: 文件紧凑、恢复快、对性能影响小(异步)。
缺点: 可能丢失最后一次快照之后的少量数据;快照生成耗时(大内存场景)。
5.2 AOF(Append Only File)日志持久化
AOF 把每次写操作命令 以追加方式记录到日志文件(默认 appendonly.aof),重启时重放命令恢复数据。
bash
# 开启 AOF
# appendonly yes
# appendfilename "appendonly.aof"
# 同步策略(appendfsync)
# always 每次写都同步,最安全但最慢
# everysec 每秒同步一次(默认,推荐)
# no 由系统决定,最快但最不安全
优点: 数据丢失少(根据同步策略),可读、可修复。
缺点: 文件比 RDB 大、恢复速度比 RDB 慢。
5.3 RDB 与 AOF 对比
| 对比项 | RDB | AOF |
|---|---|---|
| 存储内容 | 内存快照(二进制) | 写命令日志 |
| 文件大小 | 小、紧凑 | 大 |
| 恢复速度 | 快 | 慢 |
| 数据安全性 | 可能丢失较多数据 | 根据策略丢失少 |
| 对性能影响 | 异步生成影响小 | 写盘频率影响性能 |
| 优先级 | 低 | 高(同时开启时优先 AOF) |
生产实践:同时开启 AOF(everysec)+ RDB,兼顾安全与恢复速度;Redis 4.0+ 支持 AOF+RDB 混合持久化,进一步优化。
第 6 章 Redis 主从复制
6.1 什么是主从复制
主从复制:一台主节点(Master)的数据自动同步到一台或多台从节点(Slave),从节点作为主节点的备份,分担读压力。
架构特点:
- 一个主节点可以有多个从节点;
- 从节点只能读,不能写(默认);
- 主节点写数据后,异步同步到从节点;
- 从节点挂了不影响主节点,主节点挂了需要手动/哨兵处理。
6.2 配置主从复制
方式一:配置文件(从节点)
bash
# 在从节点 redis.conf 中配置
# replicaof <masterip> <masterport>
replicaof 192.168.108.10 6379
# 若主节点有密码
# masterauth 123456
方式二:命令行动态设置(从节点客户端)
bash
# 在从节点上执行
127.0.0.1:6379> slaveof 192.168.108.10 6379
# 查看复制状态
127.0.0.1:6379> info replication
# role:slave
# master_host:192.168.108.10
# master_link_status:up
# 取消主从关系
127.0.0.1:6379> slaveof no one
主节点查看从节点信息:
bash
127.0.0.1:6379> info replication
# role:master
# connected_slaves:1
# slave0:ip=192.168.108.11,port=6379,state=online
6.3 复制原理(文字描述)
- 从节点向主节点发送
PSYNC同步请求; - 主节点生成 RDB 快照发送给从节点,从节点加载快照(全量复制);
- 主节点把快照期间的写命令通过复制积压缓冲区发给从节点,从节点应用命令(增量复制);
- 之后主节点持续把新写命令推送给从节点,保持数据一致。
一句话概括:首次全量同步 RDB,之后增量同步写命令。
第 7 章 Redis 哨兵(Sentinel)高可用
7.1 为什么需要哨兵
主从复制解决了备份和读扩展,但主节点故障后无法自动恢复 。哨兵(Sentinel) 用于监控主从节点,实现主节点故障自动切换(故障转移),保证高可用。
7.2 哨兵的作用
| 功能 | 说明 |
|---|---|
| 监控(Monitoring) | 持续监控主从节点运行状态 |
| 通知(Notification) | 节点异常时通知管理员 |
| 自动故障转移(Failover) | 主节点故障时自动提升一个从节点为新主节点 |
| 配置提供(Configuration) | 客户端通过哨兵获取当前主节点地址 |
7.3 搭建哨兵(Sentinel)
bash
# 1. 复制哨兵配置文件
cp sentinel.conf /etc/redis/sentinel.conf
# 2. 配置监控的主节点
vim /etc/redis/sentinel.conf
# sentinel monitor <名称> <主IP> <主端口> <quorum>
sentinel monitor mymaster 192.168.108.10 6379 2
# 主节点密码(若有)
# sentinel auth-pass mymaster 123456
# 3. 启动哨兵
redis-sentinel /etc/redis/sentinel.conf
# 或
redis-server /etc/redis/sentinel.conf --sentinel
# 4. 查看哨兵状态
redis-cli -p 26379 info sentinel
# sentinel_masters:1
# sentinel_myid:...
配置项说明: quorum(法定人数)表示至少几个哨兵同意主节点故障才会触发切换,一般建议哨兵数量为奇数(如 3 个哨兵,quorum=2)。
7.4 故障转移过程(文字描述)
- 哨兵通过
ping心跳持续检测主节点; - 主节点在
down-after-milliseconds时间内无响应,哨兵标记其"主观下线"; - 达到 quorum 数量哨兵同意后,标记为"客观下线";
- 哨兵从所有健康的从节点中选出一个提升为新主节点(优先级、复制偏移量、运行 ID 综合评估);
- 其他从节点改为复制新主节点,客户端也被指引到新主节点。
一句话概括:哨兵投票确认主节点宕机 → 选举新主节点 → 通知所有从节点和客户端切换。
第 8 章 Redis 集群(Cluster)
8.1 什么是 Redis Cluster
单机 Redis 受内存和性能上限制约,Redis Cluster(集群) 提供数据分片(Sharding)+ 高可用的分布式方案:
- 数据自动分片到多个节点(每个节点负责一部分哈希槽 slot);
- 支持水平扩展(增加节点提升容量和性能);
- 每个节点可配置主从,主节点故障自动切换。
8.2 哈希槽(Hash Slot)
Redis Cluster 共 16384 个哈希槽(slot) 。每个 Key 通过 CRC16(key) % 16384 计算出所属 slot,集群把这些 slot 分配到各个主节点上。
分配示例: 3 个主节点时,node1 管 0-5460、node2 管 5461-10922、node3 管 10923-16383。
8.3 搭建集群
bash
# 1. 准备多个节点配置文件(每节点一个)
# 以 6 节点(3 主 3 从)为例,端口 7000-7005
# 每份 redis.conf 设置:
# port 7000
# cluster-enabled yes
# cluster-config-file nodes-7000.conf
# cluster-node-timeout 5000
# appendonly yes
# 2. 依次启动各节点
redis-server /etc/redis/7000.conf &
redis-server /etc/redis/7001.conf &
... # 7002-7005 同理
# 3. 创建集群(redis-cli --cluster 命令)
redis-cli --cluster create \
192.168.108.10:7000 192.168.108.10:7001 192.168.108.10:7002 \
192.168.108.10:7003 192.168.108.10:7004 192.168.108.10:7005 \
--cluster-replicas 1
# 前 3 个为主,后 3 个为从,--cluster-replicas 1 表示每主 1 从
# 4. 查看集群状态
redis-cli -p 7000 cluster info
# cluster_state:ok
# cluster_slots_assigned:16384
# 5. 查看节点与槽分配
redis-cli -p 7000 cluster nodes
8.4 集群常用命令
bash
# 集群信息
cluster info
# 集群节点列表
cluster nodes
# 添加主节点 / 从节点
redis-cli --cluster add-node 新节点IP:端口 现有节点IP:端口
redis-cli --cluster add-node 新节点IP:端口 现有节点IP:端口 --cluster-slave
# 删除节点(先迁移其槽位)
redis-cli --cluster del-node 节点IP:端口 node-id
# 重新分片 / 重新平衡
redis-cli --cluster reshard 现有节点IP:端口
redis-cli --cluster rebalance 现有节点IP:端口
8.5 集群注意事项
- Key 通过哈希槽分布,跨节点无法直接执行多键操作(可用 hash tag 让相关 Key 落到同一槽);
- 客户端(如 Jedis、Lettuce)需支持集群模式,自动路由到正确节点;
- 集群模式下单节点宕机会触发该节点主从切换,保证可用性。
第 9 章 Redis 应用场景与最佳实践
9.1 典型应用场景
| 场景 | 使用的数据类型 | 说明 |
|---|---|---|
| 缓存 | String | 缓存热点数据,设置过期时间 |
| 计数器/限流 | String | 点赞、访问量、接口限流 |
| 排行榜 | ZSet | 按分数排序,实时更新 |
| 消息队列 | List / Stream | 简单队列用 List,可靠队列用 Stream |
| 分布式锁 | String | SETNX + 过期时间实现 |
| Session 共享 | String/Hash | 多实例共享登录态 |
| 关注/好友 | Set | 交并差集运算 |
| 购物车/对象 | Hash | 字段化管理 |
9.2 最佳实践建议
- 合理设计 Key :使用
业务:对象:ID结构(如user:1),避免过长 Key; - 设置过期时间:避免无效 Key 长期占用内存;
- 控制 Key 数量:使用 SCAN 代替 KEYS,避免阻塞;
- 大 Key 治理:避免单个 Key 数据过大,影响性能与迁移;
- 合理淘汰策略 :根据业务选择
maxmemory-policy; - 持久化选择:缓存场景可只开 RDB,核心数据开 AOF;
- 生产高可用:主从 + 哨兵,或集群部署。
总结
- Redis 本质:基于内存、单线程、支持多种数据结构的键值存储,读写极快。
- 五大类型:String(缓存/计数器)、Hash(对象)、List(队列)、Set(去重/集合运算)、ZSet(排行榜)。
- 过期与淘汰:惰性删除 + 定期删除,内存满时按淘汰策略清理。
- 持久化:RDB(快照,恢复快)+ AOF(日志,丢数据少),生产可混合开启。
- 主从复制:一主多从,读扩展 + 备份,全量同步 + 增量同步。
- 哨兵:监控主从、主节点故障自动切换,实现高可用。
- 集群:16384 哈希槽分片,水平扩展 + 每节点主从,支撑海量数据。
希望这份 Redis 教程对你有帮助,欢迎点赞收藏,有问题评论区交流~