Redis 从入门到实战:一篇搞定缓存、持久化、主从、哨兵与集群 摘要Redis 是后端开发必会的技术栈之一。本文从零开始系统梳理 Redis 的核心概念、五种数据类型、八大应用场景、RDB/AOF 持久化机制、主从复制、哨兵高可用、Cluster 集群部署以及 Docker 容器化实战配合大量可复制的命令示例适合初学者入门和老兵复习。目录一、Redis 是什么二、Redis 为什么快三、五种核心数据类型四、八大应用场景五、持久化RDB 与 AOF六、安装与配置七、主从复制八、哨兵模式Sentinel九、Redis Cluster 集群十、Docker 容器化部署十一、总结一、Redis 是什么RedisRemote Dictionary Server是一个开源的、基于内存的高性能 Key-Value 数据库使用 C 语言编写遵循 BSD 协议。三个核心特点持久化支持将内存数据保存到磁盘重启后可重新加载丰富的数据结构不仅支持 String还提供 List、Set、Zset、Hash 等主从备份支持 Master-Slave 模式的数据备份二、Redis 为什么快特性说明纯内存操作数据存在内存中微秒级响应QPS 可达 10 万100 万单线程模型Redis 6.0 前核心网络 IO 为单线程避免上下文切换和锁竞争IO 多路复用基于 Linux epoll一个线程管理多个 socket 连接高效数据结构C 语言实现数据结构设计简洁高效简单协议RESP 协议解析成本极低IO 多路复用 — 通俗理解你去小吃街买饭烧烤、饺子、炒菜。如果每样排队等串行耗时最长三个人分别排多线程快但开销大你跟每个老板说好了叫我epoll一个线程同时等三份——这就是 IO 多路复用。Linux 上三套 APIselect轮询→poll轮询升级版→epoll事件通知主流方案。三、五种核心数据类型Redis 所有 Key 都是字符串Value 支持以下五种类型3.1 String字符串最基本类型二进制安全最大 512MB。SET key value[EX seconds][PX milliseconds][NX|XX]GET key SETEX key seconds value# 设置并指定过期时间SETNX key value# 仅当 key 不存在时设置分布式锁INCR key / DECR key# 原子递增 / 递减INCRBY key increment# 增加指定值MSET k1 v1 k2 v2# 批量设置MGET k1 k2# 批量获取STRLEN key# 字符串长度APPEND key value# 追加内容GETSET key value# 设置新值并返回旧值SET命令的可选参数EX秒级过期、PX毫秒级过期、NX不存在才设、XX存在才设。# 基本操作127.0.0.1:6379SET name wang EX100# 100秒后过期OK127.0.0.1:6379TTL name# 查看剩余时间(integer)95127.0.0.1:6379SETNX title ceo# 仅当不存在时设置(integer)1127.0.0.1:6379SET title cto XX# 仅当存在时覆盖OK3.2 List列表有序可重复的字符串链表支持左右两端操作常用于消息队列。LPUSH key value[value...]# 左侧插入RPUSH key value[value...]# 右侧插入LPOP key# 左侧弹出RPOP key# 右侧弹出BRPOP keytimeout# 阻塞式右侧弹出秒LLEN key# 列表长度LRANGE key start stop# 按范围获取LINDEX key index# 按索引获取LREM key count value# 删除指定元素127.0.0.1:6379LPUSH queuemsg1msg2(integer)2127.0.0.1:6379BRPOP queue5# 阻塞等待5秒1)queue2)msg13.3 Set集合无序、不重复的字符串集合支持交/并/差集运算。SADD key member[member...]# 添加成员SREM key member[member...]# 删除成员SMEMBERS key# 列出所有成员SISMEMBER key member# 判断是否成员SCARD key# 集合大小SINTER key1 key2# 交集SUNION key1 key2# 并集SDIFF key1 key2# 差集127.0.0.1:6379SADD tags:1redisdatabasenosql(integer)3127.0.0.1:6379SADD tags:2rediscache(integer)2127.0.0.1:6379SINTER tags:1 tags:2# 共同标签1)redis3.4 ZsetSorted Set有序集合每个元素关联一个 Score按 Score 自动排序。ZADD key score member[score member...]ZRANGE key start stop[WITHSCORES]# 按索引范围升序ZREVRANGE key start stop[WITHSCORES]# 按索引范围降序ZREM key member[member...]# 删除成员ZSCORE key member# 查询分数ZRANK key member# 查询排名升序ZCOUNT key min max# 按分数范围统计典型应用排行榜商品销量、游戏积分、实时投票。127.0.0.1:6379ZADD leaderboard100player1200player2150player3(integer)3127.0.0.1:6379ZREVRANGE leaderboard0-1WITHSCORES1)player22)2003)player34)1505)player16)1003.5 Hash哈希键值对集合适合存储对象。HSET key field value[field value...]HGET key field HGETALL key HDEL key field[field...]HEXISTS key field HLEN key HINCRBY key field increment HKEYS key / HVALS key127.0.0.1:6379HSET user:1001 name张三age25city北京(integer)3127.0.0.1:6379HGET user:1001 name张三127.0.0.1:6379HINCRBY user:1001 age1(integer)26四、八大应用场景️ 1. 热点数据缓存Cache-Aside 模式读请求 → 查 Redis → 命中返回 / 未命中 → 查 DB → 回写 Redis → 返回要点合理 TTL、缓存键命名规范product:info:1001、空值缓存防止穿透。 2. 分布式锁# 加锁仅当 key 不存在时设置30秒过期SET lock:order:1001 unique_value NX PX30000# 解锁Lua 脚本原子判断 删除EVALif redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end1lock:order:1001 unique_value要点加锁设过期 → 解锁用 Lua 保证原子性 → 长任务定时续期。 3. 计数器与限流INCR article:read:10086# 阅读量 1INCR rate:api:/user:20240709# 接口调用计数EXPIRE rate:api:/user:2024070960# 每分钟最多 N 次 4. 排行榜系统用 Zset 的 Score 排序ZREVRANGE取 Top NZRANK查排名。 5. 分布式会话Session多实例共享 Session设置过期时间自动清理。✉️ 6. 消息队列List LPUSH/BRPOP生产者推入消费者阻塞等待。️ 7. 位图Bitmap用户签到、活跃统计、权限标记极致节省空间。 8. 地理位置GEO附近的人 / 店铺查询GEOADDGEORADIUS。五、持久化RDB 与 AOFRedis 是内存数据库一旦宕机数据即丢失。持久化机制将数据写入磁盘。5.1 RDBRedis DataBase— 快照定时将内存数据生成快照保存到dump.rdb文件。触发方式# 手动触发SAVE# 同步阻塞主进程执行生产禁用BGSAVE# 异步 Fork 子进程执行推荐# 配置文件自动触发save9001# 900秒内修改1个Keysave30010# 300秒内修改10个Keysave6010000# 60秒内修改10000个KeySAVEBGSAVE执行方式主进程Fork 子进程是否阻塞✅ 阻塞所有请求❌ 仅 Fork 瞬间阻塞适用场景测试环境生产环境5.2 AOFAppend Only File— 追加日志记录每条写命令到appendonly.aof文件重启时回放恢复数据。# redis.confappendonlyyes# 开启 AOFappendfsync always# 每条命令都刷盘最安全最慢appendfsync everysec# 每秒刷盘一次推荐最多丢1秒数据appendfsync no# 由操作系统决定最快最不安全策略安全性性能推荐always最高不丢数据最低极少用everysec高最多丢1秒高✅生产推荐no低最高不推荐5.3 RDB vs AOF 对比维度RDBAOF文件大小小压缩二进制大文本命令恢复速度快慢需回放命令数据安全可能丢几分钟数据最多丢1秒everysec资源消耗Fork 子进程瞬间高持续 IO 写入推荐AOF RDB 混合使用—最佳实践生产环境同时开启 RDB 和 AOFeverysecRDB 用于快速恢复AOF 保证数据安全。六、安装与配置6.1 YUM 安装CentOS 8# 安装dnfinstall-yredis# 启动并设置开机自启systemctlenableredis--now# 验证ss-ntl|grep6379redis-cliping# 返回 PONG 即成功6.2 源码编译安装通用# 安装依赖yuminstall-ytcl gcc gcc-c# 编译tarzxvf redis-6.2.14.tar.gz-C/usr/local/cd/usr/local/redis-6.2.14/makemakeinstall# 后台启动redis-server redis.conf6.3 多实例redis-server--port6380# 启动第二个实例redis-cli-p6380# 连接到第二个实例6.4 关键配置项速查配置项默认值说明bind 127.0.0.1127.0.0.1绑定地址远程访问改0.0.0.0port 63796379监听端口protected-mode yesyes保护模式无密码时仅本地连接timeout 00客户端空闲超时0不超时tcp-keepalive 300300TCP 心跳探测间隔秒daemonize nono是否后台运行requirepass空连接密码maxmemory0最大内存限制0不限制6379 的冷知识MERZ 是作者 antirez 和朋友用的俚语形容愚蠢在手机键盘上对应数字 6379。七、主从复制Redis 主从复制实现数据冗余和读写分离Master 可读可写Slave只读一个 Master 可以有多个 Slave数据流向Master → Slave 单向实验拓扑角色IP主机名Master192.168.108.10masterSlave01192.168.108.11slave01Slave02192.168.108.12slave02配置# 所有节点配置 redis.conf bind0.0.0.0 -::1# Slave 节点额外配置指向 Master # redis.conf 方式replicaof192.168.108.106379# 命令行方式127.0.0.1:6379REPLICAOF192.168.108.106379同步原理1. Slave → Master: 发送 SYNC 命令 2. Master: 启动 BGSAVE 生成 RDB同时缓冲新增写命令 3. Master → Slave: 传输 RDB 文件 4. Slave: 加载 RDB完成首次全量同步 5. Master → Slave: 持续发送增量写命令增量同步验证# Master 查看复制状态redis-cli INFO replication# role:master# connected_slaves:2# Slave 查看redis-cli INFO replication# role:slave# master_link_status:up ← 关键必须为 up# 数据验证Master 写入127.0.0.1:6379SET name laogao OK# Slave 读取127.0.0.1:6379GET namelaogao# ✅ 同步成功取消主从127.0.0.1:6379REPLICAOF NO ONE八、哨兵模式Sentinel在主从基础上实现自动故障转移是 Redis 原生高可用方案。核心功能功能说明监控持续检查 Master 和 Slave 是否正常运行通知节点异常时通过 API 告警自动故障转移Master 宕机后自动选举新 Master配置提供者客户端通过 Sentinel 获取最新 Master 地址⚠️Sentinel 本身不存储数据只负责监控与协调。哨兵判断流程主观下线SDOWN一个 Sentinel 认为 Master 不可达 ↓ 客观下线ODOWN≥ quorum 个 Sentinel 都认为 Master 不可达 ↓ 选举 Leader Sentinel → 发起故障转移 → 提升 Slave 为新 MasterSentinel 配置# sentinel.confsentinel monitor mymaster192.168.108.1063792# 名称 Master IP 端口 quorumsentinel down-after-milliseconds mymaster30000sentinel failover-timeout mymaster180000sentinel parallel-syncs mymaster1# quorum2至少2个哨兵认为挂了才算客观下线启动哨兵redis-sentinel sentinel.conf# 查看哨兵状态redis-cli-p26379127.0.0.1:26379INFO sentinel# sentinel_masters:1# master0:namemymaster,statusok,address192.168.108.10:6379,slaves2,sentinels3九、Redis Cluster 集群哨兵解决高可用Cluster 解决数据分片水平扩展。核心概念Redis Cluster 将整个键空间划分为16384 个哈希槽数据映射公式slot CRC16(key) % 16384每个节点负责一部分槽支持在线迁移┌─────────────┬──────────────┬──────────────┐ │ Master 1 │ Master 2 │ Master 3 │ │ slot 0-5460 │slot 5461-10922│slot 10923-16383│ │ Slave 1 │ Slave 2 │ Slave 3 │ └─────────────┴──────────────┴──────────────┘创建 3 主 3 从集群# 一键创建redis-cli--clustercreate\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-replicas1# 每主1从# 验证redis-cli-c-h192.168.108.21-p6379cluster nodes redis-cli-c-h192.168.108.21-p6379cluster info# cluster_state:ok ← 关键状态# cluster_slots_assigned:16384客户端连接-c模式redis-cli-c-h192.168.108.21-p6379127.0.0.1:6379SET name wang OK127.0.0.1:6379GET age -Redirected to slot[741]located at192.168.108.21:637918故障转移验证关掉一个 Master集群自动将对应 Slave 提升为新 Master# 关掉 master 1[rootredis1 ~]# init 0# 在存活的节点上查看redis-cli-c-h192.168.108.22-p6379cluster nodes# 原 slave 已被选举为新 master ✅# cluster_state:ok ← 集群仍然正常十、Docker 容器化部署# 启动 Redis 容器dockerrun--nameredis\-p6379:6379\-d\-v/data/redis:/data\redis# 查看 Redis 信息dockerexecredis redis-cli INFO server# 数据操作dockerexecredis redis-cli SET name wangdockerexecredis redis-cli GET name# wang# 持久化数据保存在挂载的 /data/redis/dump.rdbdockerexecredis redis-cli SAVE十一、总结技术选型参考场景方案单机缓存Redis 单实例读写分离 数据冗余主从复制1 主 N 从自动故障转移哨兵模式≥ 3 个 Sentinel海量数据 水平扩展Redis Cluster≥ 6 节点3 主 3 从开发 / 测试环境Docker 一键部署 本文基于个人 Redis 学习笔记整理内容覆盖从入门到生产部署的完整链路。如有纰漏欢迎评论区交流指正。 相关资源Redis 官网 | Redis 中文文档 )