📑 目录
- 第一部分:Redis 安装与部署
- 1.1 单机部署
- 1.2 主从部署
- 1.3 哨兵部署
- 1.4 集群部署
- 第二部分:Redis 核心数据结构
- 2.1 String 字符串
- 2.2 Hash 哈希
- 2.3 List 列表
- 2.4 Set 集合
- 2.5 ZSet 有序集合
- 2.6 Bitmap 位图
- 2.7 HyperLogLog
- 2.8 Geo 地理位置
- 2.9 Stream 流
- 第三部分:常用命令速查
- 第四部分:学习总结与思考
第一部分:Redis 安装与部署
1.1 单机部署
🔧 环境准备
💡 思考:Redis 是用 C 语言写的,所以需要先装 gcc 编译环境。这点和安装 MySQL 不太一样,MySQL 一般直接用包管理器装就行。
# 关闭防火墙
systemctl stop firewalld.service
firewall-cmd –state
# 检查 gcc 版本(如果没有就安装)
gcc –version
yum install gcc
📥 下载与安装
⚠️ 注意:养成文件归类的习惯!不要什么文件都往根目录扔。
# 创建 Redis 专用目录
mkdir -p /opt/software/redis
# 下载 Redis(stable 稳定版)
cd /opt/software/redis
wget https://download.redis.io/redis-stable.tar.gz
# 解压
tar -xzf redis-stable.tar.gz
# 编译安装
cd redis-stable
make install
安装完成后,/usr/local/bin 下会生成以下文件:
| redis-benchmark | 性能测试工具 |
| redis-check-aof | 修复 AOF 文件 |
| redis-check-rdb | 修复 RDB 文件 |
| redis-sentinel | 哨兵(集群用) |
| redis-server | 服务器启动命令 ⭐ |
| redis-cli | 客户端操作入口 ⭐ |
📝 笔记:前两个(server 和 cli)是最常用的,其他的了解即可。
⚙️ 核心配置(redis.conf)
🔑 重点! 这个配置文件是后面所有部署模式的基础,一定要搞清楚每一行的含义!
vim redis.conf
| bind * -::* | 87 | 绑定所有 IP,支持远程连接 | ⭐⭐⭐ |
| daemonize yes | 309 | 后台运行(守护进程) | ⭐⭐⭐ |
| logfile /opt/…/redis.log | 355 | 日志文件路径 | ⭐⭐ |
| dir /opt/software/redis | 510 | 工作目录 | ⭐⭐ |
| requirepass 1qaz@WSX | 1044 | 设置密码 | ⭐⭐ |
| protected-mode no | 111 | 关闭保护模式(远程连接必须) | ⭐⭐⭐ |
💭 思考:daemonize yes 很关键!不设置的话,关闭终端 Redis 就停了。之前我第一次装的时候忘记设置,结果每次都要开一个终端挂着,很蠢 😅
🚀 启动与连接
# 使用配置文件启动(推荐)
redis-server redis.conf
# 客户端连接
redis-cli
# 如果设置了密码,需要认证
auth 1qaz@WSX
# 或者直接带密码连接
redis-cli -a 1qaz@WSX
🛑 退出与关闭
quit # 退出客户端
redis-cli shutdown # 关闭 Redis 服务
1.2 主从部署(Master-Slave)
🤔 什么是主从复制?
💡 理解:把一台 Redis 的数据复制到其他 Redis 上。主节点(Master)负责写,从节点(Slave)负责读。数据复制是单向的:Master → Slave。
📌 主从复制的作用
| 🔄 数据冗余 | 热备份,是持久化之外的另一种冗余方式 |
| 🛡️ 故障恢复 | Master 挂了,Slave 可以顶上 |
| ⚖️ 负载均衡 | 读写分离,Master 写、Slave 读,提高并发量 |
| 🏗️ 高可用基石 | 哨兵和集群的基础! |
🎯 重点记忆:主从复制是 Redis 高可用的基础,后面哨兵和集群都依赖它!
📐 部署架构
┌─────────────┐
│ Master │
│ (主节点) │
│ 读写服务 │
└──────┬──────┘
│ 数据复制(单向)
┌──────┴──────┐
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Slave 1 │ │ Slave 2 │
│ (从节点) │ │ (从节点) │
│ 只读服务 │ │ 只读服务 │
└─────────────┘ └─────────────┘
🔧 配置方法
📝 关键:主节点不需要改任何配置,只需要在从节点上加上主节点信息!
# 从节点配置(在从节点的 redis.conf 中添加)
replicaof 192.168.75.129 6379
# 主节点查看从节点信息
info Replication
⚠️ 主从复制的缺点
💭 思考:主从复制虽然好,但有两个明显的问题:
→ 这就是为什么需要哨兵模式!
1.3 哨兵部署(Sentinel)
🎯 哨兵解决什么问题?
💡 一句话理解:哨兵就是 Redis 的"监控管家",自动监控主从节点状态,Master 挂了自动切换!
📐 哨兵工作原理
┌──────────┐ 心跳检测 ┌─────────────┐
│ Sentinel │ ────────────→ │ Master │
│ (哨兵1) │ │ (主节点) │
└────┬─────┘ └──────┬──────┘
│ │
│ 选举 Leader │ 数据复制
▼ ▼
┌──────────┐ ┌─────────────┐
│ Sentinel │ │ Slave │
│ (哨兵2) │ │ (从节点) │
└──────────┘ └─────────────┘
🔄 故障转移流程
📝 重点!面试常考! 记住这个流程:
💭 思考:这里有个"选举"的概念。每个 Sentinel 都可以成为 Leader,票数 ≥ num(sentinels)/2 + 1 才能当选。所以哨兵数量应该是奇数!
🔧 哨兵配置(sentinel.conf)
# 3 台机器都需要修改
protected-mode no # 关闭保护模式
daemonize yes # 后台启动
logfile /opt/.../sentinel.log # 日志路径
dir /opt/software/redis # 数据存放路径
# ⭐ 最核心的配置!
sentinel monitor mymaster 192.168.75.129 6379 2
# 含义:监控名为 mymaster 的主节点,至少 2 个哨兵同意才判定故障
sentinel down-after-milliseconds mymaster 30000 # 30秒无响应判定下线
sentinel failover-timeout mymaster 180000 # 故障转移超时 180秒
✅ 验证与故障模拟
# 检查哨兵状态
redis-cli -p 26379 info sentinel
# 模拟故障:杀掉主节点
redis-cli shutdown
# 观察哨兵日志
tail -f sentinel.log
# 重新启动原主节点(会变成从节点)
redis-server redis.conf
⚠️ 注意:哨兵模式不能保证数据零丢失!因为复制是异步的,Master 故障时可能还有数据没同步到 Slave。
1.4 集群部署(Cluster)
🎯 集群解决什么问题?
💡 理解:主从 + 哨兵解决了高可用,但没有解决数据容量的问题。集群通过分片(Sharding) 把数据分散到多个节点,突破单机内存限制!
🔑 核心概念:哈希槽(Hash Slot)
📝 必考知识点!
- Redis 集群有 16384 个哈希槽(编号 0~16383)
- 每个 Key 通过 CRC16(key) % 16384 决定放在哪个槽
- 每个节点负责一部分槽
3 节点集群示例:
┌──────────────────┐
│ 节点 A (Master) │ ← 槽 0 ~ 5460
├──────────────────┤
│ 节点 B (Master) │ ← 槽 5461 ~ 10922
├──────────────────┤
│ 节点 C (Master) │ ← 槽 10923 ~ 16383
└──────────────────┘
💭 思考:为什么是 16384 个槽?这是一个权衡的结果。太少的话节点间数据不均衡,太多的话维护成本高。16384 = 2^14,CRC16 的结果对它取余效率高。
📐 集群架构(三主三从)
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Master A │ │ Master B │ │ Master C │
│ 槽0-5460 │ │槽5461- │ │槽10923- │
│ │ │ 10922 │ │ 16383 │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
│ 主从复制 │ 主从复制 │ 主从复制
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Slave A1 │ │ Slave B1 │ │ Slave C1 │
└──────────┘ └──────────┘ └──────────┘
💡 理解:每个 Master 都有一个 Slave。如果 Master B 挂了,Slave B1 自动升级为新 Master。如果 B 和 B1 都挂了,那 5461-10922 的槽就不可用了。
🔧 集群配置
# 创建集群目录
mkdir -p /opt/software/redis/redis-stable/cluster
mkdir -p /opt/software/redis/cluster
# 每台机器启动两个实例(6379 和 6380)
redis-server ./cluster/redis_6379.conf
redis-server ./cluster/redis_6380.conf
关键配置项(6379.conf 和 6380.conf 类似,只是端口不同):
bind * -::* # 允许所有 IP
daemonize yes # 后台运行
protected-mode no # 允许远程连接
cluster-enabled yes # ⭐ 开启集群模式
cluster-node-timeout 5000 # 节点超时时间
appendonly yes # 开启 AOF 持久化
cluster-config-file nodes-6379.conf # 集群配置文件
🚀 创建集群
# 创建三主三从集群
redis-cli –cluster create –cluster-replicas 1 \\
192.168.75.129:6379 192.168.75.129:6380 \\
192.168.75.131:6379 192.168.75.131:6380 \\
192.168.75.132:6379 192.168.75.132:6380
📋 集群常用命令
redis-cli cluster info # 查看集群信息
redis-cli info replication # 查看单个节点信息
redis-cli cluster nodes # 查看节点身份信息
# ⭐ 连接集群时加 -c 参数,开启路由规则
redis-cli -c # 自动跳转到正确的节点
💭 踩坑记录:不加 -c 的话,如果操作的 key 不在当前节点的槽上,会报错 MOVED。加上 -c 就会自动重定向到正确的节点。
📊 四种部署模式对比
📝 总结:面试必问!要能说清楚每种模式的优缺点和适用场景。
| 高可用 | ❌ | ❌ | ✅ | ✅ |
| 数据冗余 | ❌ | ✅ | ✅ | ✅ |
| 读写分离 | ❌ | ✅ | ✅ | ✅ |
| 自动故障转移 | ❌ | ❌ | ✅ | ✅ |
| 数据分片 | ❌ | ❌ | ❌ | ✅ |
| 扩展性 | ❌ | 一般 | 一般 | ✅ |
| 复杂度 | 低 | 中 | 中 | 高 |
| 适用场景 | 开发测试 | 读多写少 | 中小规模 | 大规模数据 |
💭 我的理解:这四种模式是逐步递进的,每种模式解决前一种的痛点:
- 单机 → 主从:解决数据备份和读写分离
- 主从 → 哨兵:解决自动故障转移
- 哨兵 → 集群:解决数据容量和水平扩展
第二部分:Redis 核心数据结构
🔑 学习提示:help @<类型名> 可以查看对应类型的所有命令,比如 help @string
2.1 String 字符串
📌 常用操作
# 基础操作
SET key value # 存入键值对
GET key # 获取值
MSET key value [key value ...] # 批量存储
MGET key [key ...] # 批量获取
SETNX key value # 存入不存在的键值对(分布式锁!)
DEL key # 删除
# 过期时间
EXPIRE key seconds # 设置过期时间(秒)
TTL key # 查看剩余过期时间
# ⭐ 原子加减(面试常问!)
INCR key # +1
DECR key # -1
INCRBY key increment # +N
DECRBY key decrement # -N
🎯 应用场景
| 单值缓存 | SET user:1:name roy | 最基本的用法 |
| 对象缓存 | SET user:1 '{"name":"roy","balance":1888}' | 存 JSON 字符串 |
| 分布式锁 | SET product:10001 true ex 10 nx | ⭐ 重点! |
| 计数器 | INCR article:1001:views | 文章浏览量 |
💭 重点理解:分布式锁用 SETNX(或 SET … NX),加上 EX 过期时间防止死锁。这是 Redis 最经典的应用场景之一!
2.2 Hash 哈希
📌 常用操作
HSET key field value # 存储一个 field
HGET key field # 获取一个 field
HMSET key field value [field value ...] # 存储多个 field
HMGET key field [field ...] # 批量获取
HDEL key field # 删除 field
HLEN key # field 数量
HGETALL key # 获取所有 field-value
HINCRBY key field increment # field 值加减
🎯 应用场景
1. 对象缓存(比 String 更省空间!)
HSET user:1 name roy balance 1888
HMGET user:1 name balance
2. 购物车 ⭐
# 用户ID为key,商品ID为field,数量为value
HSET cart:1001 10088 1 # 添加商品
HINCRBY cart:1001 10088 1 # 增加数量
HLEN cart:1001 # 商品总数
HDEL cart:1001 10088 # 删除商品
HGETALL cart:1001 # 获取所有商品
⚠️ 优缺点
| 同类数据归类存储,方便管理 | 过期功能只能用在 key 上,不能用在 field 上 |
| 比 String 更省内存和 CPU | 集群架构下不适合大规模使用 |
| 比 String 储存更节省空间 |
💭 思考:购物车用 Hash 真的很巧妙!用户 ID → key,商品 ID → field,数量 → value。增删改查都很方便。但要注意过期时间只能设在 key 级别,不能给单个商品设过期。
2.3 List 列表
📌 常用操作
LPUSH key value [value ...] # 从左边插入
RPUSH key value [value ...] # 从右边插入
LPOP key # 从左边弹出
RPOP key # 从右边弹出
LRANGE key start stop # 获取指定区间元素
# ⭐ 阻塞操作(重要!)
BLPOP key [key ...] timeout # 阻塞式左弹出
BRPOP key [key ...] timeout # 阻塞式右弹出
🎯 数据结构组合
📝 经典面试题:用 List 实现不同的数据结构!
| 栈(Stack) | LPUSH + LPOP | 先进后出 |
| 队列(Queue) | LPUSH + RPOP | 先进先出 |
| 阻塞队列(MQ) | LPUSH + BRPOP | 简化版消息队列 |
🎯 应用场景
- 视频列表、签到列表
- 排队系统
- 简化版消息队列
⚠️ 注意点
💭 重要:
2.4 Set 集合
📌 常用操作
SADD key member [member ...] # 添加元素(自动去重)
SREM key member [member ...] # 删除元素
SMEMBERS key # 获取所有元素
SCARD key # 元素个数
SISMEMBER key member # 判断是否存在
# ⭐ 集合运算(重要!)
SINTER key [key ...] # 交集
SUNION key [key ...] # 并集
SDIFF key [key ...] # 差集
🎯 应用场景
1. 抽奖系统
SADD lottery:2024 {userID} # 参与抽奖
SRANDMEMBER lottery:2024 3 # 随机抽 3 人(不移除)
SPOP lottery:2024 3 # 随机抽 3 人(移除)
2. 点赞 / 收藏 / 标签
SADD like:1001 user:001 # 点赞
SREM like:1001 user:001 # 取消点赞
SISMEMBER like:1001 user:001 # 是否点过赞
SCARD like:1001 # 点赞数
3. 社交关系 ⭐
SINTER user1:user2 user1:user3 # 共同关注(交集)
SUNION user1:user2 user1:user3 # 朋友圈所有人(并集)
SDIFF user1:user2 user1:user3 # 可能认识的人(差集)
💭 思考:Set 的集合运算在社交场景中太实用了!共同好友 = 交集,推荐好友 = 差集。面试经常问。
2.5 ZSet 有序集合
📌 常用操作
ZADD key score member [...] # 添加带分数的元素
ZREM key member [...] # 删除元素
ZSCORE key member # 获取分数
ZINCRBY key increment member # 分数加减
ZCARD key # 元素个数
# ⭐ 排行榜核心命令
ZRANGE key start stop [WITHSCORES] # 正序(分数从低到高)
ZREVRANGE key start stop [WITHSCORES] # 倒序(分数从高到低)⭐
🎯 经典应用:排行榜 ⭐
# 1. 用户点击新闻 → 热度 +1
ZINCRBY hotNews:20260531 1 "守护香港"
# 2. 展示当日排行前十
ZREVRANGE hotNews:20260531 0 9 WITHSCORES
# 3. 七日榜单合并
ZUNIONSTORE hotNews:7days 7 \\
hotNews:20260525 hotNews:20260526 ... hotNews:20260531
# 4. 展示七日排行前十
ZREVRANGE hotNews:7days 0 9 WITHSCORES
💭 重点:ZSet 是排行榜的最佳选择!每个元素带一个 score,Redis 内部自动排序。ZREVRANGE 倒序就是排行榜。ZUNIONSTORE 可以合并多天的数据计算周榜。
2.6 Bitmap 位图
📌 常用操作
SETBIT key offset value # 设置某一位(0 或 1)
GETBIT key offset # 获取某一位
BITCOUNT key [start end] # 统计 1 的个数
BITPOS key bit # 找第一个值为 bit 的位置
🎯 应用场景:签到系统
# 1号用户第100天签到
SETBIT dailycheck:1 100 1
# 统计1号用户的签到次数
BITCOUNT dailycheck:1
# 找1号用户第一次签到的时间
BITPOS dailycheck:1 1
💭 思考:Bitmap 的优势在于极其节省空间。1 亿用户的签到数据只需要约 12MB(1亿 bit ≈ 12MB)。如果用 Set 存每个用户的签到记录,内存消耗会大得多。
2.7 HyperLogLog
📌 作用
统计不重复元素的个数(基数统计),典型场景:统计网站 UV(独立访客)。
📌 常用操作
PFADD visitlog 192.168.1.1 192.168.1.2 192.168.1.1 # 添加访问记录
PFCOUNT visitlog # 统计独立访客数
PFMERGE destkey sourcekey [sourcekey ...] # 合并多个统计
💭 思考:HyperLogLog 的神奇之处在于:固定只占 12KB 内存,不管统计多少个元素!但代价是有约 0.81% 的误差。对于 UV 统计这种场景,可以接受。
2.8 Geo 地理位置
📌 常用操作
# 添加地点(经度 纬度 名称)
GEOADD changsha 113.017489 28.200454 "火车站"
# 查询两地距离
GEODIST changsha "火车站" "橘子洲" M
# 查找附近地点
GEORADIUSBYMEMBER changsha "火车站" 2 KM withdist withcoord count 4
🎯 应用场景
- 附近的人 / 附近的商家
- 外卖配送距离计算
- 打车软件距离估算
💭 思考:Geo 的底层其实就是 ZSet!Redis 把经纬度编码成一个 52 位的 score,然后用 ZSet 的排序能力来实现范围查询。所以 Geo 能用的操作,ZSet 基本都能用。
2.9 Stream 流
📌 作用
Redis 版的消息队列(MQ) = 阻塞队列 + Pub/Sub
📌 常用操作
# 添加消息(* 表示自动生成 ID)
XADD mystream * name loulan name roy
# 读取消息
XRANGE mystream – +
# 创建消费者组
XGROUP CREATE mystream groupA 0
# 消费消息
XREADGROUP GROUP groupA consumer1 COUNT 2 STREAMS mystream >
# 查看消费进度
XPENDING mystream groupA
📝 了解即可:企业中用 Stream 做消息队列的场景不多,一般用 RabbitMQ 或 Kafka。但面试可能会问到 Redis 也能做 MQ。
📊 数据结构选型速查表
📝 面试必备! 根据场景选择合适的数据结构
| 缓存 | String | SET / GET |
| 分布式锁 | String | SET NX EX |
| 计数器 | String | INCR / INCRBY |
| 对象存储 | Hash | HSET / HGETALL |
| 购物车 | Hash | HSET / HINCRBY |
| 消息队列 | List | LPUSH + BRPOP |
| 抽奖 | Set | SADD / SRANDMEMBER |
| 点赞 | Set | SADD / SREM / SCARD |
| 共同好友 | Set | SINTER / SDIFF |
| 排行榜 | ZSet | ZINCRBY / ZREVRANGE |
| 签到 | Bitmap | SETBIT / BITCOUNT |
| UV 统计 | HyperLogLog | PFADD / PFCOUNT |
| 附近的人 | Geo | GEOADD / GEORADIUS |
第三部分:常用命令速查
🔑 Key 基础命令
keys * # 查看当前库所有 key
exists key # 判断 key 是否存在
type key # 查看 key 的类型
del key # 删除 key
unlink key # 异步删除(非阻塞)
ttl key # 查看过期时间(-1永不过期,-2已过期)
expire key seconds # 设置过期时间
move key db # 移动 key 到其他库
select db # 切换数据库(默认0,共16个库)
dbsize # 当前库 key 数量
flushdb # 清空当前库 ⚠️
flushall # 清空所有库 ⚠️⚠️⚠️
⚠️ 警告:flushall 和 flushdb 在生产环境千万别用!
第四部分:学习总结与思考
🧠 知识框架图
Redis 7.X
├── 安装与部署
│ ├── 单机部署(最基础)
│ ├── 主从复制(数据冗余 + 读写分离)
│ ├── 哨兵模式(自动故障转移)
│ └── 集群模式(数据分片 + 高可用)
│
└── 核心数据结构
├── String → 缓存、锁、计数器
├── Hash → 对象、购物车
├── List → 队列、栈
├── Set → 去重、交集/并集/差集
├── ZSet → 排行榜
├── Bitmap → 签到、状态标记
├── HyperLogLog → UV 统计
├── Geo → 位置服务
└── Stream → 消息队列
❓ 疑问与待深入
💭 还需要进一步学习的内容:
📝 学习心得
这两份资料覆盖了 Redis 最核心的知识点:
- 安装教程:从单机到集群,循序渐进,四种部署模式各有适用场景
- 数据结构:9 种类型各有千秋,选择合适的类型是关键
最重要的不是死记命令,而是理解每种数据结构的特点和适用场景。面试中"为什么用这个而不是那个"比"这个命令怎么写"更重要。
接下来要重点攻克:持久化、内存策略、缓存三大问题,这些是 Redis 面试的高频考点!