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。
- 故障转移流程 :
- 主观下线(SDOWN):单个 Sentinel 认为 Master 不可达。
- 客观下线(ODOWN):达到法定数量(quorum)的 Sentinel 确认。
- 选举 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。