
大家好我是CodeStats。一个在底层技术上“考古”了四年的硬核爱好者也是WWAIC全周项目 AI 编程范式的提出者和实践者。我曾手写过一个完整的 Java Web 框架从 IoC 容器到嵌入式 Tomcat代码全开源也喜欢用通俗的语言拆解 CPU、JVM、操作系统的运行本质。本文为《Redis 系统知识完全拆解》系列的「上篇」涵盖 Redis 的架构演进、通信协议、数据类型命令及 Pipeline/Lua 脚本底层原理。中篇将深入持久化与内存管理下篇将聚焦实战场景与缓存三大经典问题。 上篇目录提问一Redis 的单机、主从、哨兵、集群模式原理区别详解提问二Redis 服务器采用什么通信协议是如何利用单线程模型的提问三Redis 常用的五种数据类型和操作命令有哪些提问四Redis 使用 Pipeline 和 Lua 脚本实现原理哪个是原子性Lua 脚本的原子性为什么不支持回滚一、Redis 的单机、主从、哨兵、集群模式原理区别详解Redis 的高可用能力是逐步迭代完善的整体遵循单机 → 主从复制 → 哨兵 Sentinel → Redis Cluster的演进路径。1. 单机模式Standalone最基础的部署方式一个 Redis 实例独立运行。痛点在于单点故障宕机即停服、内存上限受限于单机物理内存、读写性能瓶颈无法利用多核。2. 主从复制Master-Slave一主多从数据副本主节点写从节点读解决读压力与数据备份问题。全量复制从节点首次连接主节点生成 RDB 快照发送。增量复制断线重连后基于复制积压缓冲区repl_backlog_buffer同步断连期间的增量数据依赖偏移量offset判断一致性。3. 哨兵模式Sentinel在主从复制上增加了自动故障切换能力。哨兵集群通过主观下线与客观下线判断节点状态利用Raft 算法选举 Leader 执行故障转移。4. 分片集群Redis Cluster官方原生分布式方案解决海量数据与高并发写入瓶颈。哈希槽Hash Slot共16384个槽位Key 通过 CRC16 算法取模映射到不同主节点。Gossip 协议节点间去中心化通信交换集群状态。自带高可用每个主节点可挂载从节点。总结单机是起点主从解决读压力哨兵解决自动切换Cluster 解决水平扩展。生产环境视数据量与一致性要求选型。二、Redis 服务器采用什么通信协议是如何利用单线程模型的1. 通信协议RESPRedis Serialization ProtocolRESP 是 Redis 客户端与服务端之间的通信协议设计极为轻量直观的文本协议实现简单解析性能极好。5 种最小单元类型如简单字符串OK\r\n、错误-ERR\r\n、整数:100\r\n、批量字符串$5\r\nhello\r\n、数组*2\r\n$3\r\nget\r\n$3\r\nkey\r\n。前缀长度传输不需要扫描负载查找特殊字符解析高效。2. 单线程模型Reactor I/O 多路复用Redis 的网络模型本质是单 Reactor 单线程模型。I/O 多路复用基于 Linux 的epoll或 BSD 的kqueue一个线程能同时监听成千上万个 socket 连接。文件事件处理器将连接、读写、命令执行等事件派发给不同处理器。6.0 演进引入多线程 I/O处理网络数据的读写但核心命令的执行依旧是单线程。为什么早年死守单线程执行命令避免多线程上下文切换与锁竞争。对 CPU 缓存极致友好零锁设计保证数据结构操作绝对线程安全。三、Redis 常用的五种数据类型和操作命令有哪些类型底层数据结构核心命令示例String字符串SDS简单动态字符串SET key value、GET key、INCR key、SETNX key valueHash哈希压缩列表 / 哈希表HSET key field value、HGET key field、HINCRBY key field 1List列表压缩列表 / 双向链表LPUSH key value、RPUSH key value、LRANGE key 0 -1、LPOP keySet集合整数集合 / 哈希表SADD key member、SMEMBERS key、SINTER key1 key2交集Sorted Set有序集合压缩列表 / 跳表 哈希表ZADD key score member、ZRANGE key 0 -1 WITHSCORES、ZINCRBY key 1 member通用命令DEL key、EXISTS key、EXPIRE key seconds、TTL key、KEYS pattern生产慎用可用SCAN替代。四、Redis 使用 Pipeline 和 Lua 脚本实现原理哪个是原子性Lua 脚本的原子性为什么不支持回滚1. Pipeline管道—— 批量运输车原理将多个命令在客户端打包一次性发送给 RedisRedis 按序执行后一次性返回所有结果。目的减少网络往返时间RTT提升吞吐量。原子性❌非原子性。Redis 服务端仍然是逐个执行命令执行过程中其他客户端的命令完全可以穿插进来。2. Lua 脚本 —— 服务端原子计算器原理将业务逻辑封装成 Lua 脚本整个脚本作为一个整体发送给 Redis 服务端执行。原子性✅绝对的原子性。脚本执行期间Redis 主线程被完全占用不会执行任何其他命令直到脚本结束。3. 为什么 Lua 脚本不支持回滚这是 Redis 设计哲学的核心体现追求极致的性能和简洁。脚本执行过程中如果第 3 步报错前 2 步的写入已经生效比如DECR扣了库存。Redis 官方认为错误的回滚机制极其复杂且损耗性能需要记录 Undo Log与 Redis 轻量级、高速缓存/存储的定位相悖。最佳实践开发者应在脚本开头做好完备的逻辑校验if判断确保前置条件满足后再执行写操作从业务层杜绝半途而废的情况。总结无脑攒命令用Pipeline需要读-计算-写如扣库存且要求原子性必须用Lua 脚本。 上篇总结与预告本篇我们拆解了 Redis 的四大架构演进、RESP 协议内幕、五大数据类型命令以及 Pipeline 与 Lua 的底层博弈。下一篇中篇我们将深入最底层的持久化机制RDB 与 AOF 的源码级对比、过期策略的三种权衡以及内存淘汰策略的八种选型。敬请期待