一、Redis 概述
1. 特点
- 高性能:10万~100万+ QPS,微秒级响应
- 丰富数据结构:String、Hash、List、Set、Sorted Set
- 原子操作:单命令原子性,支持事务(MULTI/EXEC)
- 持久化:RDB 快照 + AOF 日志
- 主从复制、哨兵、集群(Cluster)高可用方案
2. 优势
- 基于内存,C语言实现
- 单线程模型(6.0前)+ IO多路复用(epoll)
- 支持多种编程语言客户端
- 功能丰富:Lua脚本、发布订阅、Pipeline、Key过期等
二、数据类型及常用命令
1. String
SET key value [EX seconds] [NX|XX]GET keyINCR / DECR(原子计数器)MSET / MGET(批量操作)SETNX(分布式锁基础)
2. List
LPUSH / RPUSH(左/右插入)LPOP / RPOP(左/右弹出)LRANGE key start stop(范围查询)BLPOP / BRPOP(阻塞式弹出)
3. Set
SADD key member(添加)SMEMBERS key(查看全部)SINTER / SUNION / SDIFF(交集/并集/差集)
4. Sorted Set(ZSet)
ZADD key score member(添加带分值元素)ZRANGE / ZREVRANGE(按分数升/降序获取)ZRANK(排名)、ZSCORE(获取分数)
5. Hash
HSET key field value/HGET key fieldHMSET / HMGET(批量)HGETALL(获取所有字段及值)HDEL(删除字段)
三、高级特性
1. 管道(Pipeline)
- 将多个命令打包一次发送,减少 RTT
- 适用场景:批量操作,网络延迟高时效果显著
2. 发布/订阅(Pub/Sub)
SUBSCRIBE channel/PUBLISH channel messagePSUBSCRIBE pattern(模式订阅)- 消息即发即弃,无持久化
3. 事务
MULTI开启,EXEC执行,DISCARD取消- 不支持回滚,但保证命令顺序执行
4. Lua 脚本
- 原子性执行多个操作
EVAL script numkeys key [key ...] arg [arg ...]
四、持久化
1. RDB(快照)
- 触发方式:
save(阻塞)、bgsave(fork子进程) - 配置:
save 900 1等 - 优点:恢复快,文件紧凑
- 缺点:可能丢失最后一次快照后的数据
2. AOF(追加日志)
- 记录每个写命令,重启时重放
- 策略:
always/everysec/no - 重写:
bgrewriteaof或自动触发(auto-aof-rewrite-percentage) - 优点:数据更安全,最多丢1秒数据
- 缺点:文件大,恢复慢
3. 混合持久化(RDB+AOF)
- AOF 文件以 RDB 格式开头 + 增量命令
- 快速恢复 + 数据安全
五、主从复制
1. 概念
- 一个 Master 多个 Slave,数据单向同步
- Master 可读写,Slave 只读
2. 配置
replicaof <master_ip> <master_port>info replication查看状态
3. 同步流程
- Slave 发送
SYNC/PSYNC - Master 生成 RDB 并发送,后续增量命令持续同步
六、哨兵模式(Sentinel)
1. 作用
- 监控主从健康,自动故障转移
- 提供主节点地址给客户端
2. 核心配置
conf
sentinel monitor mymaster 192.168.108.10 6379 2
sentinel down-after-milliseconds mymaster 30000
3. 故障转移流程
- 主观下线(SDOWN)
- 客观下线(ODOWN,多数哨兵确认)
- 选举 Leader
- 提升最优 Slave 为新 Master
- 更新其他 Slave 复制目标
七、Redis Cluster(集群)
1. 特点
- 无中心架构,数据分片(16384 个哈希槽)
- 每个 Master 负责一部分槽,可配 Slave
- 自动故障转移(无需 Sentinel)
2. 数据映射
HASH_SLOT = CRC16(key) mod 16384
3. 搭建要点
- 至少 3 主 3 从
- 配置
cluster-enabled yes - 创建集群:
redis-cli --cluster create <ip:port> ... --cluster-replicas 1
4. 故障转移
- 主节点宕机,其 Slave 自动选举为新 Master
- 集群状态变为
ok需大部分槽可用
八、缓存典型问题
| 问题 | 定义 | 解决方案 |
|---|---|---|
| 雪崩 | 大量 Key 同时过期或 Redis 宕机 | 过期时间加随机值;高可用集群;限流熔断;多级缓存 |
| 穿透 | 查询不存在的数据(缓存+DB 都无) | 缓存空值(短 TTL);布隆过滤器 |
| 击穿 | 热点 Key 过期,大量并发打到 DB | 互斥锁;永不过期(后台异步更新) |
九、常用管理命令
| 命令 | 说明 |
|---|---|
INFO [section] |
查看服务器信息 |
CONFIG GET/SET parameter |
动态修改配置(部分参数) |
SLOWLOG GET/LEN/RESET |
慢查询日志 |
KEYS pattern |
查找 Key(生产慎用,阻塞) |
DBSIZE |
当前库 Key 数量 |
FLUSHDB / FLUSHALL |
清空当前/所有库(建议禁用) |
EXPIRE / TTL |
设置/查看过期时间 |
SELECT dbindex |
切换数据库(Cluster 不支持) |
十、性能与安全建议
- 避免使用
KEYS *,改用SCAN游标迭代 - 设置
rename-command FLUSHALL ""等禁用危险命令 - 使用
requirepass设置密码 - 生产环境开启
protected-mode yes并绑定内网 IP - 合理设置
maxmemory及淘汰策略(如allkeys-lru) - 大 Key 拆分,避免慢操作