Redis服务器构建、Redis常用指令、Redis数据类型、Redis数据持久化、Redis缓存服务器的所有内容
一、Redis 简介
Redis(Remote Dictionary Server) 是一个开源的、基于内存的 高性能键值数据库,支持多种数据结构,常用于:
- 缓存(最常见)
- 会话存储(Session Store)
- 消息队列(Pub/Sub、Stream)
- 分布式锁
- 实时排行榜(ZSet)
✅ 特点:
- 单线程(6.0+ 支持多线程 I/O)
- 基于内存(可持久化)
- 支持主从复制、哨兵、集群
- QPS 可达 10万+
二、Redis 服务器构建
1. 安装方式(Linux CentOS/Ubuntu)
方式 A:YUM/APT 安装(推荐生产)
# CentOS/RHEL
sudo yum install -y epel-release
sudo yum install -y redis
# Ubuntu/Debian
sudo apt update
sudo apt install -y redis-server
方式 B:源码编译(最新版)
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar xzf redis-7.2.4.tar.gz
cd redis-7.2.4
make && sudo make install
# 启动
redis-server
2. 配置文件(/etc/redis.conf 关键配置)
| 配置项 | 默认值 | 建议值 | 说明 |
|---|---|---|---|
bind | 127.0.0.1 | 0.0.0.0(内网) | 监听地址 |
port | 6379 | 6379 | 端口 |
protected-mode | yes | no(配合密码) | 保护模式 |
requirepass | "" | your_strong_password | 密码认证 |
maxmemory | 0(无限制) | 80% 物理内存 | 内存上限 |
maxmemory-policy | noeviction | allkeys-lru | 内存淘汰策略 |
daemonize | no | yes | 后台运行 |
logfile | "" | /var/log/redis/redis.log | 日志路径 |
dir | ./ | /var/lib/redis | RDB/AOF 存储目录 |
🔐 安全建议:
- 绑定内网 IP(如
bind 192.168.1.10)- 设置强密码:
requirepass Your@Complex#Pass123- 禁用危险命令(如
FLUSHALL):rename-command FLUSHALL "" rename-command CONFIG ""
3. 启动与管理
# 启动服务
sudo systemctl start redis
sudo systemctl enable redis
# 检查状态
systemctl status redis
redis-cli ping # 返回 PONG 表示正常
# 连接(带密码)
redis-cli -a Your@Complex#Pass123
三、Redis 常用指令
1. 通用命令
| 命令 | 说明 |
|---|---|
PING | 测试连接 |
INFO | 查看服务器信息(内存、客户端、持久化等) |
SELECT | 切换数据库(0~15,默认 0) |
KEYS pattern | 查找 key(生产禁用!) |
EXISTS key | 判断 key 是否存在 |
DEL key [key...] | 删除 key |
TYPE key | 查看 key 类型 |
TTL key | 查看剩余生存时间(秒) |
FLUSHDB | 清空当前库 |
FLUSHALL | 清空所有库 |
⚠️ 警告:
KEYS *在大数据量下会阻塞 Redis,应使用SCAN。
2. 性能监控命令
# 实时监控
redis-cli --stat
# 慢查询日志
SLOWLOG GET 10
# 客户端连接
CLIENT LIST
四、Redis 五大核心数据类型
1. String(字符串)
- 最基本类型,可存字符串、数字、二进制(≤512MB)
- 常用命令:
SET name "Alice" GET name INCR counter # 自增(原子操作) DECR counter # 自减 SETEX token 3600 "abc123" # 带过期时间 MSET k1 v1 k2 v2 # 批量设置 MGET k1 k2 # 批量获取 - 应用场景:缓存、计数器、分布式锁(
SET key value NX EX 10)
2. Hash(哈希表)
- 存储字段-值对(类似对象)
- 常用命令:
HSET user:1001 name "Bob" age 30 HGET user:1001 name HMGET user:1001 name age HGETALL user:1001 HDEL user:1001 age HINCRBY user:1001 login_count 1 - 应用场景:用户资料、商品详情
3. List(列表)
- 有序、可重复,底层是 快速链表(quicklist)
- 常用命令:
LPUSH mylist "A" "B" # 左插入 → ["B", "A"] RPUSH mylist "C" # 右插入 → ["B", "A", "C"] LPOP mylist # 弹出左端 → "B" RPOP mylist # 弹出右端 → "C" LRANGE mylist 0 -1 # 获取全部 LLEN mylist # 长度 - 应用场景:消息队列、最新 N 条记录(如朋友圈)
4. Set(集合)
- 无序、唯一元素,支持交并差集
- 常用命令:
SADD tags:news "sports" "politics" SMEMBERS tags:news SISMEMBER tags:news "sports" SREM tags:news "politics" SINTER set1 set2 # 交集 SUNION set1 set2 # 并集 SDIFF set1 set2 # 差集 - 应用场景:标签系统、共同好友
5. Sorted Set(有序集合 / ZSet)
- 每个元素关联 分数(score),自动按分排序
- 常用命令:
ZADD leaderboard 100 "Alice" 95 "Bob" 98 "Charlie" ZRANGE leaderboard 0 -1 WITHSCORES # 正序 ZREVRANGE leaderboard 0 9 # 逆序(Top 10) ZSCORE leaderboard "Alice" ZINCRBY leaderboard 5 "Bob" # 分数+5 ZRANK leaderboard "Charlie" # 排名(从0开始) - 应用场景:排行榜、延迟队列(score = 时间戳)
五、Redis 数据持久化
Redis 提供两种持久化机制,可单独或组合使用:
1. RDB(快照 Snapshotting)
- 原理:定时将内存数据全量写入磁盘(二进制文件
dump.rdb) - 触发方式:
- 自动:
save 900 1(900秒内至少1次修改) - 手动:
SAVE(阻塞)或BGSAVE(后台 fork 子进程)
- 自动:
- 优点:文件紧凑、恢复快、适合备份
- 缺点:可能丢失最后一次快照后的数据
📌 配置示例(
redis.conf):save 900 1 save 300 10 save 60 10000 dbfilename dump.rdb dir /var/lib/redis
2. AOF(Append Only File)
- 原理:记录每个写操作命令,重启时重放
- 同步策略:
appendfsync always:每次写都刷盘(安全但慢)appendfsync everysec:每秒刷盘(推荐,最多丢1秒)appendfsync no:由 OS 决定(快但不安全)
- 优点:数据更安全,可读性好
- 缺点:文件大、恢复慢
📌 配置示例:
appendonly yes appendfilename "appendonly.aof" appendfsync everysec auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
3. 持久化选择建议
| 场景 | 推荐方案 |
|---|---|
| 纯缓存 | 关闭持久化(save "" + appendonly no) |
| 重要数据 | RDB + AOF(everysec) |
| 高性能要求 | 仅 RDB |
| 极致安全 | AOF(always)+ 副本 |
💡 混合持久化(Redis 4.0+):
开启aof-use-rdb-preamble yes,AOF 文件前半部分是 RDB 格式,后半部分是 AOF 命令,兼顾速度与安全。
六、Redis 作为缓存服务器
1. 缓存工作流程
sequenceDiagram
Client->>App: 请求数据
App->>Redis: GET key
alt Redis 命中
Redis-->>App: 返回数据
App-->>Client: 返回结果
else Redis 未命中
App->>MySQL: 查询数据库
MySQL-->>App: 返回数据
App->>Redis: SET key value EX 3600
App-->>Client: 返回结果
end
2. 缓存策略
| 策略 | 说明 | 适用场景 |
|---|---|---|
| Cache-Aside(旁路缓存) | 应用负责读写 DB 和 Cache | 最常用 |
| Read/Write Through | Cache 代理 DB 读写 | 复杂,少用 |
| Write Behind | 先写 Cache,异步写 DB | 高写性能,风险高 |
✅ Cache-Aside 实现要点:
- 读:先读缓存,未命中查 DB,回填缓存
- 写:先更新 DB,再删除缓存(不是更新缓存!)
3. 缓存穿透、击穿、雪崩
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 穿透 | 查询不存在的数据(绕过缓存打 DB) | 1. 布隆过滤器 2. 缓存空值( SET key "" EX 60) |
| 击穿 | 热点 key 过期瞬间大量请求打 DB | 1. 逻辑过期(不设 TTL,后台更新) 2. 互斥锁(Redis SET key lock NX EX 5) |
| 雪崩 | 大量 key 同时过期 | 1. 随机 TTL(基础值 + 随机数) 2. 高可用集群 |
4. 缓存最佳实践
- Key 设计规范:
业务:实体:id(如user:profile:1001) - Value 大小:≤ 10KB(避免大 Key 阻塞)
- 过期时间:必须设置(防止内存溢出)
- 监控:命中率 > 95%,内存使用 < 80%
七、高可用与扩展
1. 主从复制(Replication)
- 一主多从,异步复制
- 配置从节点:
SLAVEOF master_ip 6379 # 或配置文件 replicaof 192.168.1.10 6379
2. 哨兵(Sentinel)
- 监控主从状态,自动故障转移
- 至少 3 个 Sentinel 节点
3. 集群(Cluster)
- 数据分片(16384 slots),自动 rebalance
- 至少 6 节点(3主3从)
- 客户端需支持 Cluster(如 JedisCluster)
八、总结
| 模块 | 关键点 |
|---|---|
| 部署 | 内网绑定 + 密码 + 内存限制 |
| 数据类型 | String/Hash/List/Set/ZSet 各司其职 |
| 持久化 | RDB(快照) + AOF(命令日志) |
| 缓存 | Cache-Aside + 防穿透/击穿/雪崩 |
| 高可用 | 主从 → 哨兵 → 集群 |
💡 记住:
- Redis 是 缓存,不是数据库!重要数据必须落库
- 永远不要在生产用
KEYS *- 监控命中率和内存是运维核心









