Redis 7.0 完全学习指南

Redis 7.0 完全学习指南

服务器环境:华为云 ecs-7c2c 系列 × 4 台 | Ubuntu 24.04 | 2vCPU / 4GiB
Redis 版本:7.0.15(apt 安装)
集群架构:1 Master(redis-01)+ 2 Slave(redis-02/03)+ Sentinel 哨兵
复现所有命令:均可直接运行。密码统一:Redis@2024!


第一章:Redis 基础入门

1.1 Redis 概述

1.1.1 Redis 定义与特点

RedisRemote Dictionary Server)是一款开源的、基于内存的键值对(Key-Value)存储系统,由 Salvatore Sanfilippo(antirez)于 2009 年用 C 语言编写。它通常被称作数据结构服务器,因为值(Value)可以是字符串、哈希、列表、集合、有序集合等多种数据结构。

官方定义

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, message broker, and streaming engine.

核心特点

特点 说明
内存存储 所有数据存在内存中,读写速度极快(微秒级延迟)
数据结构丰富 String / List / Set / Sorted Set / Hash / Bitmap / HyperLogLog / Geo / Stream
单线程模型 6.0 前纯单线程,无锁竞争,天然串行化;6.0+ 引入 I/O 多线程
持久化支持 RDB 快照 + AOF 日志 + 混合持久化
高可用 主从复制 + Sentinel 哨兵 + Cluster 集群
原子操作 所有命令都是原子操作,支持事务(MULTI/EXEC)和 Lua 脚本
发布订阅 内置 Pub/Sub 消息模式
过期策略 支持键的自动过期(TTL)和多种内存淘汰策略

1.1.2 Redis 发展历程与版本演进

2009年  Redis 0.1   —— antirez 为 LLOOGG 项目开发的原型
2010年  Redis 1.2   —— VM 虚拟内存(后被废弃)
2011年  Redis 2.0   —— 引入 Pub/Sub
2012年  Redis 2.4   —— 引入 Variadic 参数命令
2013年  Redis 2.6   —— Lua 脚本、位操作
2014年  Redis 2.8   —— Sentinel 哨兵稳定版、SCAN 命令
2015年  Redis 3.0   —— Redis Cluster 正式版(去中心化集群)
2017年  Redis 4.0   —— 混合持久化、模块系统、UNLINK 异步删除
2018年  Redis 5.0   —— Stream 数据类型、ZPOPMIN/ZPOPMAX
2020年  Redis 6.0   —— ACL 权限控制、I/O 多线程、SSL/TLS、RESP3
2020年  antirez 离开 Redis 项目 [重要的社区转折]
2022年  Redis 7.0   —— 函数式编程、ACL v2、Sharded Pub/Sub
2023年  Redis 7.2   —— 社区版持续迭代
2024年  Redis 变更许可证 —— 从 BSD 3-Clause 改为 RSALv2/SSPLv1

重要提示:2024年3月起,Redis 不再使用 BSD 许可证。社区 fork 版本 Valkey 由 Linux 基金会托管,保持 BSD 开源。

本实战环境使用 Redis 7.0.15:

Redis server v=7.0.15 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=e53ff17674aa6190

1.1.3 Redis 与传统数据库的区别

维度 Redis MySQL(关系型) MongoDB(文档型)
存储介质 内存(可持久化) 磁盘 磁盘(WiredTiger 缓存)
数据模型 Key-Value + 数据结构 表(行/列) 文档(BSON)
查询语言 命令式(SET/GET/ZRANGE) SQL MQL
Schema 无模式 严格模式 灵活模式
扩展方式 Cluster 分片 主从 / 分库分表 Sharding
事务 弱事务(无回滚) ACID 强事务 多文档事务(4.0+)
典型延迟 < 1ms 1-10ms(有索引) 1-5ms
核心场景 缓存/计数/排行榜/锁 OLTP 业务存储 内容管理/日志

Redis 不是 MySQL 的替代品,而是互补关系——这是面试高频考点。

1.1.4 Redis 的应用场景

┌──────────────────────────────────────────────────────────────────┐
│                        Redis 典型应用场景                         │
├────────────┬─────────────────────────────────────────────────────┤
│  缓存系统   │ 热点数据缓存、页面缓存、API 响应缓存(Cache-Aside)    │
│  计数器     │ 文章阅读量、点赞数、库存扣减(INCR/DECR 原子操作)      │
│  排行榜     │ 游戏分数排名、热门文章排行(ZADD + ZREVRANGE)          │
│  分布式锁   │ 跨进程/跨服务器的资源互斥访问(SETNX + Lua)            │
│  消息队列   │ 异步任务队列(List BLPOP / Stream)                    │
│  会话存储   │ 分布式 Session(Spring Session + Redis)               │
│  好友关系   │ 共同关注、推荐好友(Set 交并差集)                      │
│  限流       │ 滑动窗口限流、令牌桶(ZSET + Lua)                     │
│  Geo 位置   │ 附近的人、配送范围筛选(GEOADD / GEORADIUS)           │
│  发布订阅   │ 实时消息推送、聊天通知(PUBLISH / SUBSCRIBE)           │
└────────────┴─────────────────────────────────────────────────────┘

1.1.5 Redis 性能优势

官方基准数据(单机 Redis):

  • 读:~110,000 QPS(GET 操作)
  • 写:~80,000 QPS(SET 操作)
  • 延迟:< 1ms(局域网)

本次实战 Benchmark 结果(2vCPU / 4GiB 华为云 ECS,Redis 7.0.15):

# redis-benchmark -q -n 30000 -c 50

SET:    209,790.20  requests per second   ← 20万+ QPS
GET:    205,479.45  requests per second   ← 20万+ QPS
INCR:   212,765.95  requests per second   ← 21万+ QPS
LPUSH:  209,790.20  requests per second
LPOP:   211,267.59  requests per second
SADD:   209,790.20  requests per second
HSET:   211,267.59  requests per second
ZADD:   209,790.20  requests per second

性能解读:在低配云主机上,Redis 所有操作都能达到 20万+ QPS。这意味着一个四核服务器轻易突破 50 万 QPS,远远快于同配置下的 MySQL(通常 2K-10K QPS)。


1.2 NoSQL 数据库简介

1.2.1 NoSQL 概念与分类

NoSQL = Not Only SQL,泛指非关系型数据库。产生背景是 Web 2.0 时代传统关系型数据库在处理海量数据和高并发时的性能瓶颈。

NoSQL 四大分类:

┌────────────────────────────────────────────────────────────────────┐
│                      NoSQL 四大分类                                 │
├─────────────┬──────────────────┬───────────────────────────────────┤
│  键值存储    │ Redis, Memcached │ 简单键值对,极速读写               │
│  文档型      │ MongoDB, CouchDB │ JSON/BSON 文档,灵活 Schema        │
│  列族型      │ HBase, Cassandra │ 按列存储,适合大数据分析           │
│  图数据库    │ Neo4j, JanusGraph│ 节点+边,社交关系/知识图谱         │
└─────────────┴──────────────────┴───────────────────────────────────┘

1.2.2 NoSQL 与关系型数据库对比

对比维度 NoSQL(Redis) RDBMS(MySQL)
CAP 侧重 AP(可用性 + 分区容错) CA(一致性 + 可用性)
数据一致性 最终一致性 强一致性(ACID)
扩展性 水平扩展(加节点) 垂直扩展(加配置)
Schema 灵活,动态添加字段 预定义表结构
典型 QPS 10万 ~ 100万 1千 ~ 1万
适用场景 高并发、低延迟、非结构化 复杂事务、关联查询

1.2.3 常见 NoSQL 数据库对比

数据库 类型 特点 适用场景
Redis 键值 + 数据结构 内存极速、数据结构丰富 缓存/排行榜/锁/队列
Memcached 纯键值 多线程、简单高效 纯缓存(仅 String)
MongoDB 文档型 JSON 灵活 Schema 内容管理、日志存储

Redis vs Memcached(面试高频):

  • Memcached 只支持 String;Redis 支持 5+ 核心数据结构
  • Redis 支持持久化,Memcached 纯内存(重启丢失)
  • Memcached 多线程,Redis 6.0 前单线程(但 QPS 仍更高)
  • Redis 支持主从/集群/哨兵,Memcached 需客户端实现

1.3 安装与配置

1.3.1 Windows 环境安装

Windows 官方不直接支持 Redis,但可通过以下方式:

方案一:WSL2(推荐)

# 在 WSL2 Ubuntu 中安装
sudo apt update && sudo apt install -y redis-server

方案二:Memurai(Windows 原生兼容版)
下载地址:https://www.memurai.com/

方案三:Docker Desktop

docker run -d --name redis -p 6379:6379 redis:7-alpine

1.3.2 Linux 环境安装(apt)

本实战环境:Ubuntu 24.04,通过 APT 安装。

# === 完整安装步骤 ===

# Step 1: 更新包索引并安装
sudo apt update
sudo apt install -y redis-server redis-tools

# Step 2: 验证版本
redis-server --version
# 输出: Redis server v=7.0.15 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64

# Step 3: 启动并设置开机自启
sudo systemctl start redis-server
sudo systemctl enable redis-server

# Step 4: 验证运行
redis-cli ping       # 返回 PONG
ss -tlnp | grep 6379 # 检查端口监听

APT 包内容

文件 路径 说明
redis-server /usr/bin/redis-server Redis 服务端主程序
redis-cli /usr/bin/redis-cli 命令行客户端
redis-benchmark /usr/bin/redis-benchmark 性能压测工具
redis-check-rdb /usr/bin/redis-check-rdb RDB 文件修复工具
redis-check-aof /usr/bin/redis-check-aof AOF 文件修复工具
redis-sentinel /usr/bin/redis-sentinel 哨兵模式执行文件
redis.conf /etc/redis/redis.conf 主配置文件

1.3.3 Docker 容器化部署

# 单节点
docker run -d --name redis-01 \
  -p 6379:6379 \
  -v /data/redis/conf:/usr/local/etc/redis \
  -v /data/redis/data:/data \
  redis:7-alpine \
  redis-server /usr/local/etc/redis/redis.conf

# 查看日志
docker logs -f redis-01

# 进入容器
docker exec -it redis-01 redis-cli

1.3.4 Redis 配置文件详解(redis.conf)

Redis 的核心配置文件是 /etc/redis/redis.conf,包含超过 1500 行注释和配置。以下是关键配置项详解

1. 网络配置
# === 监听地址 ===
# 127.0.0.1:仅本地访问(默认,最安全)
# 0.0.0.0:监听所有网络接口(生产环境需配合防火墙)
bind 0.0.0.0

# 使用场景说明:
# - 单机开发:bind 127.0.0.1(最安全)
# - 主从复制:bind 0.0.0.0(从节点需要连接)
# - 如果设置 bind 127.0.0.1 且 replicaof 指向内网 IP:
#   从节点会无法连接到主节点!

# === 端口 ===
port 6379

# === 保护模式 ===
# yes(默认):无密码 + 非 127.0.0.1 时,拒绝外部连接
# no:关闭保护模式(必须设置密码再关闭)
protected-mode no

# === 超时 ===
# 空闲连接超时秒数,0 = 永不超时
timeout 0
2. 安全配置
# === 密码认证 ===
# Redis 的密码是明文传输的(除非启用 TLS)
# 设置后所有客户端命令都需要先 AUTH
requirepass Redis@2024!

# === 主从复制认证密码 ===
# 当本节点作为 Slave 连接 Master 时的认证密码
# 与 requirepass 通常设为相同值
masterauth Redis@2024!
3. 持久化配置
# ===== RDB 快照 =====
# 格式: save <seconds> <changes>
# 含义: 在 N 秒内如果有 M 个 key 被修改,则触发 RDB 持久化

save 900 1     # 15 分钟内至少 1 次修改 → 触发保存
save 300 10    # 5 分钟内至少 10 次修改 → 触发保存
save 60 10000  # 1 分钟内至少 10000 次修改 → 触发保存

# 禁用 RDB:
# save ""

# RDB 文件名
dbfilename dump.rdb

# RDB 文件存放目录
dir /var/lib/redis

# 是否在 BGSAVE 失败时拒绝写入
stop-writes-on-bgsave-error yes

# 是否压缩 RDB 文件(开启节省空间,但消耗 CPU)
rdbcompression yes

# RDB 文件校验
rdbchecksum yes

# ===== AOF 持久化 =====
# 是否开启 AOF 持久化
appendonly no

# AOF 文件名
appendfilename "appendonly.aof"

# AOF 写入策略:
# always:    每次写操作都 fsync(最安全但最慢)
# everysec:  每秒一次 fsync(推荐,平衡性能与安全)
# no:        由操作系统决定何时 fsync(最快但可能丢数据)
appendfsync everysec
4. 内存管理
# 最大内存限制
# 0 = 不限制(会使用所有可用内存,导致 OOM)
# 建议设置为物理内存的 50%-70%
maxmemory 2gb

# 内存淘汰策略(内存满时的行为):
# noeviction:     不淘汰,写入返回 error(默认)
# allkeys-lru:    在所有 key 中淘汰最近最少用的
# volatile-lru:   在有过期时间的 key 中淘汰最近最少用的
# allkeys-lfu:    在所有 key 中淘汰最不常用的
# volatile-lfu:   在有过期时间的 key 中淘汰最不常用的
# allkeys-random: 在所有 key 中随机淘汰
# volatile-random:在有过期时间的 key 中随机淘汰
# volatile-ttl:   淘汰最接近过期的 key
maxmemory-policy noeviction
5. 主从复制
# 指定主节点(本机作为 Slave)
# replicaof <masterip> <masterport>

# 示例: 本机作为 192.168.0.54:6379 的从节点
replicaof 192.168.0.54 6379

# 从节点是否只读(建议保持 yes)
replica-read-only yes
6. 慢查询日志
# 执行时间超过此值的命令被记录(微秒, 1ms = 1000us)
slowlog-log-slower-than 10000

# 最大保留条数
slowlog-max-len 128

1.3.5 服务启动与管理

# === systemd 管理 ===
sudo systemctl start redis-server     # 启动
sudo systemctl stop redis-server      # 停止
sudo systemctl restart redis-server   # 重启
sudo systemctl status redis-server    # 查看状态
sudo systemctl enable redis-server    # 开机自启
sudo systemctl disable redis-server   # 取消自启

# === 手动启动 ===
redis-server /etc/redis/redis.conf    # 指定配置文件启动

# === 优雅关闭 ===
redis-cli -a 'yourpassword' shutdown  # 先持久化再关闭
redis-cli -a 'yourpassword' shutdown nosave  # 不持久化,直接关闭

# === 验证 ===
redis-cli -a 'Redis@2024!' ping       # 测试连接
redis-cli -a 'Redis@2024!' INFO server # 查看服务器信息

第二章:Redis 核心数据结构

为什么先学数据结构? Redis 的数据结构就是它的 API。每个数据结构都像一把特定的工具,选对工具 = 事半功倍。

2.1 字符串(String)

String 是 Redis 最基础的数据类型——一个 Key 对应一个字符串值。虽然是"字符串",但它可以存储文本、数字、二进制数据(如图片、序列化对象),单个 value 最大 512MB

2.1.1 基本命令

# === 基础读写 ===
SET key value [EX seconds] [PX milliseconds] [NX|XX]
GET key
SETEX key seconds value           # 设置 + 过期时间(原子操作)
SETNX key value                   # 仅当 key 不存在时设置(原子操作)
MSET key1 val1 key2 val2 ...      # 批量设置
MGET key1 key2 ...                # 批量获取
GETSET key value                  # 设置新值,返回旧值

# === 实战示例 ===
SET user:1001:name 'Alice'
SET user:1001:email 'alice@example.com'
MGET user:1001:name user:1001:email
# 返回: 1) "Alice"  2) "alice@example.com"

STRLEN user:1001:name
# 返回: (integer) 5

SETEX session:token123 60 'logged_in'  # 60秒后自动过期
TTL session:token123
# 返回: (integer) 52  (剩余秒数)

2.1.2 计数器(INCR/DECR)

String 的数字操作是原子性的——这是实现分布式计数器的核心。

# === 数字原子操作 ===
INCR key        # 值 +1(如果 key 不存在则初始化为 0 再 +1)
INCRBY key N    # 值 +N
DECR key        # 值 -1
DECRBY key N    # 值 -N
INCRBYFLOAT key 1.5  # 浮点数增减

# === 实战:文章阅读量计数器 ===
SET counter:visits 0
INCR counter:visits       # → 1
INCRBY counter:visits 10  # → 11
GET counter:visits
# 返回: "11"

面试考点:为什么 Redis 的 INCR 能用于分布式计数器?

  • 单线程模型:所有命令串行执行,天然线程安全
  • 原子性:INCR 内部是 C 函数原子调用,不会被中断
  • 不需要分布式锁,不需要事务

2.1.3 位图(Bitmap)

Bitmap 不是独立的数据类型,而是在 String 上操作的位操作命令集合。

# === Bitmap 操作 ===
SETBIT key offset value    # 设置第 offset 位的值(0 或 1)
GETBIT key offset          # 获取第 offset 位的值
BITCOUNT key [start end]   # 统计值为 1 的位数
BITOP AND/OR/XOR/NOT dest key1 key2 ...  # 位操作
BITPOS key bit [start end] # 第一个值为 bit 的位置

# === 实战:用户签到统计 ===
# 用户 1001、1002、1003 在 2026-06-01 登录
SETBIT user:login:20260601 1001 1
SETBIT user:login:20260601 1002 1
SETBIT user:login:20260601 1003 1
SETBIT user:login:20260601 1004 0   # 1004 未登录(设为 0)

BITCOUNT user:login:20260601
# 返回: (integer) 3    ← 3 个用户登录

# 内存优势:1 亿用户的签到数据仅需 12.5MB
# 1 亿位 = 100,000,000 / 8 = 12,500,000 字节 ≈ 12MB

2.1.4 String 底层实现:SDS

Redis 的 String 底层使用简单动态字符串(Simple Dynamic String, SDS),而非 C 语言的 char*

为什么不直接用 C 字符串?

特性 C 字符串 Redis SDS
获取长度 O(n) 遍历 O(1) 直接读取 len 字段
缓冲区溢出 可能溢出(strcat) 自动扩容,杜绝溢出
内存分配 每次修改都需分配 预分配 + 惰性释放
二进制安全 遇到 \0 就截断 通过 len 保证安全
可存储内容 纯文本 文本、图片、序列化对象

SDS 结构体(简化版)

struct 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值