欢迎光临
我们一直在努力

Redis 7 学习笔记

📑 目录

  • 第一部分: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

⚠️ 主从复制的缺点

💭 思考:主从复制虽然好,但有两个明显的问题:

  • 复制延迟:写操作先在 Master 上执行,再同步到 Slave,有延迟。Slave 越多延迟越严重。
  • Master 挂了怎么办? 默认不会自动选举新 Master,需要人工干预!
  • → 这就是为什么需要哨兵模式!


    1.3 哨兵部署(Sentinel)

    🎯 哨兵解决什么问题?

    💡 一句话理解:哨兵就是 Redis 的"监控管家",自动监控主从节点状态,Master 挂了自动切换!

    📐 哨兵工作原理

    ┌──────────┐ 心跳检测 ┌─────────────┐
    │ Sentinel │ ────────────→ │ Master │
    │ (哨兵1) │ │ (主节点) │
    └────┬─────┘ └──────┬──────┘
    │ │
    │ 选举 Leader │ 数据复制
    ▼ ▼
    ┌──────────┐ ┌─────────────┐
    │ Sentinel │ │ Slave │
    │ (哨兵2) │ │ (从节点) │
    └──────────┘ └─────────────┘

    🔄 故障转移流程

    📝 重点!面试常考! 记住这个流程:

  • 主观下线:某个 Sentinel 发现 Master 没有响应 PING → 认为主观下线
  • 客观下线:询问其他 Sentinel,超过 quorum 个数同意 → 客观下线
  • 选举 Leader:Sentinel 之间投票选出一个 Leader 来执行故障转移
  • 选择新 Master:从 Slave 中按优先级选择
  • 切换:将其他 Slave 指向新 Master
  • 通知客户端:告知应用新的 Master 地址
  • 💭 思考:这里有个"选举"的概念。每个 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 简化版消息队列

    🎯 应用场景

    • 视频列表、签到列表
    • 排队系统
    • 简化版消息队列

    ⚠️ 注意点

    💭 重要:

  • List 容量上限是 2³² – 1(约 40 亿),但要注意大 key 问题
  • 底层是双向链表,两端操作快,但中间操作慢(类似 Java 的 LinkedList)

  • 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 → 消息队列

    ❓ 疑问与待深入

    💭 还需要进一步学习的内容:

  • 持久化机制:RDB 和 AOF 的区别?混合持久化?
  • 内存淘汰策略:8 种淘汰策略分别是什么?
  • 缓存穿透 / 缓存击穿 / 缓存雪崩:怎么解决?
  • Redis 事务:和关系型数据库事务有什么区别?
  • Lua 脚本:在 Redis 中怎么用?
  • Redis 7 新特性:Function、Multi-part AOF 等
  • 📝 学习心得

    这两份资料覆盖了 Redis 最核心的知识点:

    • 安装教程:从单机到集群,循序渐进,四种部署模式各有适用场景
    • 数据结构:9 种类型各有千秋,选择合适的类型是关键

    最重要的不是死记命令,而是理解每种数据结构的特点和适用场景。面试中"为什么用这个而不是那个"比"这个命令怎么写"更重要。

    接下来要重点攻克:持久化、内存策略、缓存三大问题,这些是 Redis 面试的高频考点!


    赞(0)
    未经允许不得转载:171主机测评 » Redis 7 学习笔记
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址