Redis 核心知识点整理

markdown 复制代码
# Redis 核心知识点整理

## 1. Redis 简介
- **定义**:高性能键值内存数据库,遵守 BSD 协议。
- **三大特点**:
  1. 支持持久化(RDB / AOF)。
  2. 丰富数据结构(String, Hash, List, Set, ZSet)。
  3. 支持主从复制(Master-Slave)。
- **优势**:
  - 性能极高:10W~100W+ QPS,微秒级响应。
  - 原子操作:单命令原子性,支持事务(MULTI/EXEC)。
  - 丰富特性:发布订阅、键过期、Lua 脚本、Pipeline 等。
- **哈希槽(Cluster)**:固定 16384 个槽,键通过 `CRC16(key) % 16384` 映射到槽,实现数据分片。

---

## 2. 五种基本数据类型及常用命令

### 2.1 String(字符串)
- 二进制安全,最大 512MB。
- 常用命令(示例 + 注释):
```redis
# 设置键值(带过期时间)
SET name "Alice" EX 10     # 10秒后过期
# 仅当键不存在时设置(分布式锁)
SETNX lock "1"            
# 获取值
GET name
# 批量设置/获取
MSET key1 v1 key2 v2
MGET key1 key2
# 原子增减(计数器)
INCR counter               # 自增1
INCRBY counter 5           # 增加5
DECR counter
# 追加字符串
APPEND name " Smith"
# 获取长度
STRLEN name

2.2 List(列表)

  • 有序、可重复,左右都可操作,最多 2^32-1 个元素。
  • 常用命令:
redis 复制代码
# 从左边(头部)插入
LPUSH mylist a b c
# 从右边(尾部)插入
RPUSH mylist d e
# 弹出左边/右边元素
LPOP mylist
RPOP mylist
# 获取列表范围(支持负索引)
LRANGE mylist 0 -1       # 全部
# 获取长度
LLEN mylist
# 阻塞式弹出(队列场景)
BRPOP queue 10           # 阻塞10秒,有数据则返回

2.3 Set(集合)

  • 无序、无重复,支持集合运算(交集、并集、差集)。
redis 复制代码
# 添加成员
SADD myset a b c
# 获取所有成员
SMEMBERS myset
# 判断成员是否存在
SISMEMBER myset a
# 移除成员
SREM myset b
# 交集、并集、差集
SINTER set1 set2
SUNION set1 set2
SDIFF set1 set2

2.4 ZSet(有序集合)

  • 每个成员关联一个分数(score),按分数排序,成员唯一。
redis 复制代码
# 添加带分数的成员
ZADD leaderboard 100 "Alice" 90 "Bob"
# 按分数升序/降序获取成员
ZRANGE leaderboard 0 -1 WITHSCORES
ZREVRANGE leaderboard 0 -1
# 获取成员分数
ZSCORE leaderboard "Alice"
# 获取排名(升序从0开始)
ZRANK leaderboard "Bob"
# 删除成员
ZREM leaderboard "Alice"

2.5 Hash(哈希)

  • 键值对集合,适合存储对象(如用户信息)。
redis 复制代码
# 设置字段
HSET user:1001 name "John" age 30
# 获取字段值
HGET user:1001 name
# 批量获取
HMGET user:1001 name age
# 获取所有字段和值
HGETALL user:1001
# 删除字段
HDEL user:1001 age
# 查看所有字段名/值
HKEYS user:1001
HVALS user:1001

3. 持久化机制

3.1 RDB(快照)

  • 触发方式
    • save(同步阻塞)
    • bgsave(异步 fork 子进程)
    • 配置自动触发(如 save 900 1
  • 优点:文件紧凑,恢复快,适合备份。
  • 缺点:可能丢失最后一次快照后的数据。
  • 配置示例redis.conf):
conf 复制代码
# 900秒内至少1个key变更则触发bgsave
save 900 1
save 300 10
save 60 10000
# 是否压缩
rdbcompression yes
# 文件名
dbfilename dump.rdb
# 工作目录
dir /var/lib/redis

3.2 AOF(追加日志)

  • 记录所有写命令,重启时重放。
  • 同步策略
    • always:每次写都 fsync(最安全,慢)
    • everysec:每秒 fsync(默认,最多丢1秒数据)
    • no:由操作系统控制(最快,不安全)
  • 重写(Rewrite) :压缩 AOF 文件(bgrewriteaof)。
  • 优点:数据更完整(最多丢1秒)。
  • 缺点:文件大,恢复慢。
  • 配置示例
conf 复制代码
# 开启AOF
appendonly yes
# 文件名
appendfilename "appendonly.aof"
# 同步策略
appendfsync everysec
# 重写条件(增长百分比和最小大小)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

注意:同时启用 RDB 和 AOF 时,Redis 优先使用 AOF 恢复数据。


4. 高可用架构

4.1 主从复制(Master-Slave)

  • 用途:读写分离、数据冗余、故障恢复基础。
  • 特点:一个 Master 多个 Slave,数据单向同步(Master -> Slave),Slave 只读。
  • 配置 (在 Slave 的 redis.conf):
conf 复制代码
replicaof <master_ip> <master_port>
# 或动态命令
REPLICAOF <master_ip> <port>
  • 查看复制状态
redis 复制代码
INFO replication

4.2 哨兵模式(Sentinel)

  • 目的:在主从基础上实现自动故障转移。
  • 架构:多个 Sentinel 进程监控 Master 和 Slave。
  • 故障转移流程
    1. 主观下线(SDOWN):单个 Sentinel 认为 Master 不可达。
    2. 客观下线(ODOWN):达到法定数量(quorum)的 Sentinel 确认。
    3. 选举 Leader 执行故障转移,提升一个 Slave 为新 Master。
  • 配置sentinel.conf):
conf 复制代码
# 监控主节点,quorum=2
sentinel monitor mymaster 192.168.108.10 6379 2
# 主观下线超时(毫秒)
sentinel down-after-milliseconds mymaster 30000
# 启动哨兵
redis-sentinel sentinel.conf &

4.3 Redis Cluster(集群)

  • 目的:数据分片 + 高可用,无中心化。
  • 核心机制
    • 16384 个哈希槽,分配到多个 Master 节点。
    • 每个 Master 可配 Slave(自动故障转移)。
    • 节点间通过 Gossip 协议通信。
  • 部署:至少 3 个 Master,推荐 3 主 3 从。
  • 创建集群(任意节点执行):
bash 复制代码
redis-cli --cluster create \
  192.168.108.21:6379 192.168.108.22:6379 192.168.108.23:6379 \
  192.168.108.24:6379 192.168.108.25:6379 192.168.108.26:6379 \
  --cluster-replicas 1
  • 客户端连接 :使用 -c 参数支持自动重定向。
bash 复制代码
redis-cli -c -h 192.168.108.22 -p 6379
  • 查看集群状态
redis 复制代码
CLUSTER NODES
CLUSTER INFO
  • 故障转移:Master 宕机后,其 Slave 自动晋升(约 15~30 秒恢复)。

5. 缓存三大问题及解决方案

5.1 缓存穿透

  • 现象:查询不存在的数据(缓存和 DB 都没有),大量请求直接打到 DB。
  • 解决方案
    • 接口层校验(如 ID 合法性)。
    • 缓存空对象(空值也缓存,设置短 TTL)。
    • 布隆过滤器(Bloom Filter)提前拦截。

5.2 缓存击穿

  • 现象:热点 Key 过期瞬间,大量并发请求同时查询 DB。
  • 解决方案
    • 热点 Key 永不过期(手动更新)。
    • 加互斥锁(如 SETNX),只允许一个线程查 DB 并更新缓存。

5.3 缓存雪崩

  • 现象:大量 Key 同时过期或缓存服务宕机,全部请求涌向 DB。
  • 解决方案
    • 过期时间增加随机偏移(如 10 分钟 ± 随机数)。
    • 搭建 Redis 高可用(哨兵/集群)。
    • 多级缓存(本地缓存 + Redis)。
    • 限流熔断(如 Sentinel、Hystrix)。

6. Pipeline(流水线)

  • 作用:将多个命令打包一次发送,减少网络 RTT 开销。
  • 适用:批量操作且不需要立即返回每个命令结果。
  • 性能对比 (示例:1000 条命令):
    • 本机:非 Pipeline ~573ms,Pipeline ~134ms。
    • 异地机房:非 Pipeline ~80s,Pipeline ~1.1s。
  • 使用方式(以 Python redis-py 为例):
python 复制代码
import redis
r = redis.Redis()
pipe = r.pipeline()
for i in range(1000):
    pipe.set(f"key:{i}", i)
pipe.execute()  # 一次性发送所有命令

7. Redis 安装与配置(CentOS 源码编译)

bash 复制代码
# 安装编译依赖
yum install tcl gcc gcc-c++ -y
# 解压并编译安装
tar -zxvf redis-6.2.14.tar.gz -C /usr/local/
cd /usr/local/redis-6.2.14
make && make install

# 修改配置文件(示例:bind、密码、持久化)
vim redis.conf
# 常见设置:
bind 0.0.0.0              # 允许远程连接(需设置密码)
requirepass yourpassword  # 设置认证密码
appendonly yes            # 开启AOF

# 启动(后台运行)
redis-server redis.conf &

# 客户端连接(带密码)
redis-cli -a yourpassword

8. 常用运维命令

命令 说明
INFO 查看服务器状态(分段:Server, Clients, Memory, Persistence, Replication, Cluster...)
CONFIG GET <param> 获取配置参数
CONFIG SET <param> <value> 动态设置配置(重启失效,部分参数支持)
SLOWLOG GET <n> 查看慢查询日志(需配置 slowlog-log-slower-than
DBSIZE 当前库 key 数量
FLUSHDB / FLUSHALL 清空当前库/所有库(危险!可重命名禁用)
SHUTDOWN 安全关闭服务器(先持久化)
KEYS pattern 查找匹配 key(生产慎用,O(N) 扫描)

慢查询配置示例

conf 复制代码
slowlog-log-slower-than 10000  # 10ms(单位微秒)
slowlog-max-len 128           # 保留128条

9. 消息队列(MQ)实现

9.1 基于 List(生产者-消费者模式)

redis 复制代码
# 生产者 LPUSH,消费者 RPOP 或 BRPOP(阻塞)
LPUSH queue task1 task2
BRPOP queue 0         # 阻塞直到有数据

9.2 发布/订阅(Pub/Sub)

redis 复制代码
# 订阅频道
SUBSCRIBE channel1
# 发布消息
PUBLISH channel1 "hello"
# 模式订阅(通配符)
PSUBSCRIBE news.*

注意:Pub/Sub 消息不持久化,订阅者离线会丢失消息。


10. 常用客户端(Python 示例)

python 复制代码
import redis
# 连接
r = redis.Redis(host='192.168.108.172', port=6379, password='123456', db=0)
# String
r.set('color', 'red')
val = r.get('color')          # b'red'
# List
r.lpush('mylist', 'a', 'b')
print(r.lrange('mylist', 0, -1))
# Hash
r.hset('user:1', 'name', 'John')
r.hset('user:1', 'age', 30)
print(r.hgetall('user:1'))

11. 图形工具

  • Redis Desktop Manager (RDM):跨平台 GUI 客户端,支持树形展示、命令执行。
  • 连接前需配置 Redis 绑定 0.0.0.0 并设置密码,开放防火墙端口。

总结

  • Redis 是高性能内存数据库,支持丰富数据结构和持久化。
  • 主从复制、哨兵、Cluster 分别解决备份、高可用、分布式扩展。
  • 缓存穿透/击穿/雪崩需针对性设计防范。
  • Pipeline 和批量操作可大幅提升网络效率。
  • 生产环境务必禁用危险命令(KEYS *, FLUSHALL),可重命名或使用 rename-command