4. Redis 缓存入门:核心数据结构、Docker 部署与持久化机制
Redis 是后端缓存一致性的核心组件。本章从数据结构、Docker 部署、持久化三个维度建立 Redis 操作基础,为后续缓存同步调试提供可复现的实验环境。
4.1 Redis 核心数据结构与适用场景
Redis 提供 5 种基本数据类型,每种对应不同的缓存模式。下表列出核心操作命令与典型用例:
| 数据类型 | 底层编码 | 核心命令 | 典型场景 |
|---|---|---|---|
| String | int / embstr / raw | SET / GET / INCR / DECR | 计数器、分布式锁、Session 缓存 |
| Hash | ziplist / hashtable | HSET / HGET / HGETALL / HINCRBY | 对象缓存(用户信息、商品详情) |
| List | quicklist | LPUSH / RPUSH / LPOP / BRPOP | 消息队列、时间线、最新列表 |
| Set | intset / hashtable | SADD / SREM / SMEMBERS / SINTER | 标签系统、好友关系、去重 |
| Sorted Set | ziplist / skiplist | ZADD / ZRANGE / ZREVRANK / ZINCRBY | 排行榜、延时队列、限流滑动窗口 |
选型建议: 缓存单个值用 String;缓存结构化对象用 Hash;需要排序或范围查询用 Sorted Set;需要集合运算用 Set;需要 FIFO 或阻塞消费用 List。
4.2 Docker 部署单机 Redis
使用 Docker 快速搭建可复现的 Redis 实验环境,避免宿主机污染。以下步骤适用于后续所有缓存同步调试场景。
4.2.1 拉取镜像与启动容器
# 拉取指定版本(推荐 7.0+)
docker pull redis:7.0-alpine
# 启动单机 Redis,暴露 6379 端口
docker run -d \
--name redis-single \
-p 6379:6379 \
redis:7.0-alpine \
redis-server --appendonly yes
4.2.2 验证连接与基本操作
# 进入容器交互式客户端
docker exec -it redis-single redis-cli
# 测试写入与读取
127.0.0.1:6379> SET cache:user:1001 "{\"name\":\"Alice\"}"
OK
127.0.0.1:6379> GET cache:user:1001
"{\"name\":\"Alice\"}"
127.0.0.1:6379> TYPE cache:user:1001
string
4.2.3 持久化配置挂载
生产环境需将数据目录与配置文件挂载到宿主机:
docker run -d \
--name redis-persist \
-p 6379:6379 \
-v /data/redis:/data \
-v /etc/redis/redis.conf:/usr/local/etc/redis/redis.conf \
redis:7.0-alpine \
redis-server /usr/local/etc/redis/redis.conf
注意: 容器删除后数据会丢失。必须挂载
/data 卷或启用持久化机制,否则缓存恢复测试将无法复现。
4.3 Redis 持久化机制:RDB 与 AOF
Redis 提供两种持久化方式,理解其差异是缓存一致性调试的前提——持久化策略直接影响故障恢复后的缓存状态。
4.3.1 RDB(快照)
RDB 在指定时间间隔生成全量二进制快照,适合备份与快速重启。触发方式包括:
- 手动触发:
SAVE(同步阻塞) /BGSAVE(异步 fork) - 自动触发: 配置
save <seconds> <changes>条件 - 关闭时触发: 配置
stop-writes-on-bgsave-error yes
# redis.conf 示例:60 秒内至少 1000 次写入则触发 BGSAVE
save 60 1000
save 300 100
save 3600 1
dbfilename dump.rdb
dir /data
4.3.2 AOF(追加文件)
AOF 记录每次写操作指令,通过回放实现数据恢复,数据安全性更高。三种 fsync 策略对比:
| 策略 | 配置值 | 数据安全性 | 性能影响 | 最多丢失数据 |
|---|---|---|---|---|
| 每秒同步 | appendfsync everysec | 高 | 中等 | 1 秒写操作 |
| 每次写入同步 | appendfsync always | 极高 | 低(约 30% 性能损失) | 1 次写操作 |
| 由操作系统决定 | appendfsync no | 低 | 最高 | 30 秒以上写操作 |
# redis.conf 启用 AOF
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
4.3.3 RDB vs AOF 对比
| 维度 | RDB | AOF |
|---|---|---|
| 文件大小 | 小(二进制压缩) | 大(文本协议) |
| 恢复速度 | 快(直接加载) | 慢(逐条回放) |
| 数据丢失风险 | 较高(快照间隔) | 低(取决于 fsync 策略) |
| 对写性能影响 | 低(fork 子进程) | 中等(追加写入) |
| 可读性 | 不可读 | 可读(纯文本指令) |
| 适用场景 | 备份、冷启动、灾备 | 数据安全优先、实时恢复 |
生产建议: 同时开启 RDB + AOF。RDB 用于快速重启与备份,AOF 用于最小化数据丢失。Redis 重启时优先加载 AOF(数据更完整)。
4.4 持久化流程与数据恢复路径
下图展示 Redis 持久化写入与恢复的完整链路,帮助理解缓存数据在磁盘与内存之间的流转:
4.5 混合持久化与最佳实践
Redis 4.0+ 支持混合持久化(aof-use-rdb-preamble yes),AOF 文件头部包含 RDB 快照,后续追加增量 AOF 日志。这种方式结合了 RDB 的快速恢复与 AOF 的低数据丢失优势。
# 启用混合持久化
aof-use-rdb-preamble yes
# 查看持久化状态
127.0.0.1:6379> INFO persistence
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1710000000
aof_enabled:1
aof_rewrite_in_progress:0
aof_last_rewrite_time_sec:-1
调试建议: 在后续缓存同步实验中,建议同时开启 RDB + AOF(everysec),并定期执行
BGREWRITEAOF 压缩 AOF 文件。这能保证容器重启后缓存状态可追溯,便于排查一致性偏差。