<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Redis 缓存与高性能数据结构专题 on PlumePHP</title><link>https://plumephp.com/posts/redis/</link><description>Recent content in Redis 缓存与高性能数据结构专题 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sun, 16 Aug 2026 15:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/redis/index.xml" rel="self" type="application/rss+xml"/><item><title>缓存架构演进之路：从单机 Redis 到亿级分布式多级缓存体系</title><link>https://plumephp.com/redis-cache-architecture-evolution/</link><pubDate>Sun, 16 Aug 2026 15:00:00 +0800</pubDate><guid>https://plumephp.com/redis-cache-architecture-evolution/</guid><description>&lt;p&gt;缓存是构建高性能 Web 系统的核心基础设施。从早期工程师在单机内存里放一个 HashMap 临时存数据，到今天支撑亿万 QPS 的分布式多级缓存体系，缓存架构经历了一场深刻的技术演进。理解这一演进过程，不仅有助于我们在不同业务阶段做出合理的架构选型，更能帮助我们在面对电商大促、社交热点等高并发场景时从容应对。本文将系统梳理缓存架构从单体到分布式的完整演进路径，并深入探讨热点 Key 治理、一致性哈希、缓存预热及成本优化等生产实践议题。&lt;/p&gt;</description></item><item><title>Redis 7.x 重大新特性与架构升级深度解析</title><link>https://plumephp.com/redis-7x-new-features/</link><pubDate>Sun, 16 Aug 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/redis-7x-new-features/</guid><description>&lt;p&gt;Redis 7.x 是 Redis 发展史上最重要的版本之一。从 2022 年 Redis 7.0 GA 发布，到 2023 年 Redis 7.2 引入 waitaof 和客户端驱逐，再到 2024 年 Redis 7.4 及 Redis 8.0 预览版的推出，这一系列的版本迭代不仅在底层数据结构上完成了关键重构，还在服务端脚本、权限安全、集群通信和性能扩展方面带来了革命性变化。本文将逐层拆解 Redis 7.x 每个大版本的核心改进，并提供生产环境迁移的完整决策地图。&lt;/p&gt;</description></item><item><title>Redis 消息队列深度对比：Pub/Sub、Streams 与 Kafka/RabbitMQ 选型指南</title><link>https://plumephp.com/redis-message-queue-comparison/</link><pubDate>Sun, 16 Aug 2026 13:00:00 +0800</pubDate><guid>https://plumephp.com/redis-message-queue-comparison/</guid><description>&lt;p&gt;消息队列是现代分布式系统的核心基础设施。Redis 作为广为人知的内存数据库，在消息队列领域提供了 Pub/Sub 和 Streams 两套方案。与此同时，Apache Kafka 和 RabbitMQ 长期占据专业消息中间件的主导地位。它们之间不是简单的替代关系，而是在延迟、吞吐量、持久化与运维成本之间做出了不同的权衡。本文将从架构原理到生产实战，全方位对比这四种方案，帮助你做出准确的技术选型。&lt;/p&gt;</description></item><item><title>Redis 数据迁移与集群扩容：从单节点到分布式的大规模迁移实战</title><link>https://plumephp.com/redis-data-migration/</link><pubDate>Sun, 16 Aug 2026 12:00:00 +0800</pubDate><guid>https://plumephp.com/redis-data-migration/</guid><description>&lt;p&gt;Redis 作为内存数据库，在生产环境的生命周期中必然面临各种迁移需求：业务增长推动单节点升级为集群架构、机房搬迁需要跨数据中心迁移、服务器老化触发硬件替换，或是云原生转型需要接入 Kubernetes 部署。每一次迁移都牵一发而动全身，数据完整性、服务可用性、迁移效率三者必须同时满足。本文从真实生产场景出发，系统梳理 Redis 数据迁移的九大核心主题，涵盖工具选型、Slot 重分片、BigKey 治理、一致性校验与零停机切换的完整操作流程。&lt;/p&gt;</description></item><item><title>Redis 监控与可观测性实战：生产运维全链路指南</title><link>https://plumephp.com/redis-monitoring-observability/</link><pubDate>Sun, 16 Aug 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/redis-monitoring-observability/</guid><description>&lt;p&gt;Redis 在生产环境中性能极高，但一旦出现问题往往是突发性的：内存瞬间耗尽导致 OOM、单条慢查询拖垮主线程、客户端连接数暴涨引发服务拒绝。监控与可观测性不是锦上添花，而是保障 Redis 持续可靠运行的底线工程。&lt;/p&gt;</description></item><item><title>Redis 微服务架构模式：缓存、限流、会话与熔断</title><link>https://plumephp.com/redis-microservices-patterns/</link><pubDate>Sun, 16 Aug 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/redis-microservices-patterns/</guid><description>&lt;p&gt;微服务架构将单体应用拆分为独立部署的服务单元，每个服务拥有自己的数据域和生命周期。在这一架构下，Redis 不再只是简单的缓存组件，而是演变为支撑服务间通信、数据共享、流量治理和高可用保障的基础设施。本文系统梳理 Redis 在微服务场景中的八大核心模式，并提供可落地的代码实现。&lt;/p&gt;</description></item><item><title>Redis 网络模型与高 I/O 性能：从单线程事件循环到多线程 I/O</title><link>https://plumephp.com/redis-network-io-model/</link><pubDate>Sat, 15 Aug 2026 14:30:00 +0800</pubDate><guid>https://plumephp.com/redis-network-io-model/</guid><description>&lt;p&gt;Redis 之所以能在单机缓存领域长期保持 10 万 QPS 以上的吞吐量，与其精心设计的网络模型密不可分。从经典的单线程事件循环到 Redis 6.0 引入的多线程 I/O，从 RESP 明文协议到 TLS 加密传输，每一步架构选择都蕴含着深刻的工程权衡。本文深入 Redis 底层源码与操作系统机制，带你理解 C10K（单机万级连接）甚至 C100K 场景下 Redis 如何做到高并发低延迟，以及在生产环境中如何调优网络参数、规避性能陷阱。&lt;/p&gt;</description></item><item><title>Redis 内存管理深度解析：分配器、碎片治理与驱逐策略</title><link>https://plumephp.com/redis-memory-management/</link><pubDate>Sat, 15 Aug 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/redis-memory-management/</guid><description>&lt;p&gt;Redis 作为纯内存数据库，内存不仅是数据存储介质，更是决定服务可用性的核心资源。一个 64GB 内存的 Redis 节点，可能实际存储的有效数据不足 40GB，剩余空间被内部分配器开销、数据结构元数据、内存碎片以及过期键残留所吞噬。理解 Redis 内存管理的底层机制，是在生产环境中避免 OOM、控制成本、提升容量的必修课。&lt;/p&gt;</description></item><item><title>Redis 性能调优与生产监控</title><link>https://plumephp.com/redis-performance-tuning/</link><pubDate>Fri, 14 Aug 2026 14:10:00 +0800</pubDate><guid>https://plumephp.com/redis-performance-tuning/</guid><description>&lt;h2 id="1-redis-内存模型与优化策略"&gt;1. Redis 内存模型与优化策略&lt;/h2&gt;
&lt;h3 id="11-redis-对象结构"&gt;1.1 Redis 对象结构&lt;/h3&gt;
&lt;p&gt;Redis 使用 &lt;strong&gt;Redis Object（robj）&lt;/strong&gt; 作为所有数据类型的统一包装结构，每个键值对都对应一个 &lt;code&gt;robj&lt;/code&gt; 和一个 &lt;code&gt;dictEntry&lt;/code&gt;：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌───────────────────────────────────────────┐
│ dictEntry (哈希表节点) │
├──────────────┬────────────────────────────┤
│ key │ robj → 字符串 &amp;#34;user:1001&amp;#34; │
│ value │ robj → 实际数据结构 │
│ next │ 链表指针（处理哈希冲突） │
└──────────────┴────────────────────────────┘

┌───────────────────────────────────────────┐
│ robj (Redis Object) │
├──────────────┬────────────────────────────┤
│ type │ 数据类型（string/list/hash/ │
│ │ set/zset/sstream等） │
│ encoding │ 内部编码（raw/int/hashtable │
│ │ /ziplist/skiplist等） │
│ lru │ 最后访问时间（LRU/LFU用） │
│ refcount │ 引用计数（共享对象复用） │
│ *ptr │ 指向实际数据结构的指针 │
└──────────────┴────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;编码方式自动选择&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>09. Java 客户端与 Spring Data Redis</title><link>https://plumephp.com/redis-spring-boot/</link><pubDate>Fri, 14 Aug 2026 14:09:00 +0800</pubDate><guid>https://plumephp.com/redis-spring-boot/</guid><description>&lt;h2 id="1-jedis-vs-lettuce"&gt;1. Jedis vs Lettuce&lt;/h2&gt;
&lt;p&gt;在 Java 生态中，Jedis 与 Lettuce 是两类主流的 Redis 客户端实现，二者在底层线程模型、连接方式以及对 Spring Boot 的集成策略上存在本质差异，工程师在选型时应根据并发量级、部署拓扑以及集群管理需求做出权衡。&lt;/p&gt;</description></item><item><title>Redis 事务、Lua 脚本与原子操作</title><link>https://plumephp.com/redis-transactions-lua/</link><pubDate>Fri, 14 Aug 2026 14:08:00 +0800</pubDate><guid>https://plumephp.com/redis-transactions-lua/</guid><description>&lt;h2 id="1-redis-事务multiexecdiscard"&gt;1. Redis 事务（MULTI/EXEC/DISCARD）&lt;/h2&gt;
&lt;h3 id="11-事务模型"&gt;1.1 事务模型&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Redis 事务与关系型数据库事务不同：&lt;strong&gt;没有回滚机制&lt;/strong&gt;，命令在 EXEC 时批量顺序执行，中间某命令失败不影响后续命令。&lt;/p&gt;</description></item><item><title>Redis 主从复制与 Sentinel 高可用</title><link>https://plumephp.com/redis-replication-ha/</link><pubDate>Fri, 14 Aug 2026 14:04:00 +0800</pubDate><guid>https://plumephp.com/redis-replication-ha/</guid><description>&lt;h2 id="1-主从复制replication"&gt;1. 主从复制（Replication）&lt;/h2&gt;
&lt;h3 id="11-复制流程"&gt;1.1 复制流程&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Slave 发起同步 ──→ Master 判断同步方式 ──→ 全量或增量同步

全量同步（首次或 runid 不匹配）：
 1. Slave 发送 PSYNC ? -1
 2. Master 执行 BGSAVE → 生成 RDB
 3. Master 发送 RDB 到 Slave
 4. Slave 清空内存 → 加载 RDB
 5. Master 将新写入命令追加到 Replication Buffer → 发送给 Slave
 6. 进入持续同步模式

增量同步（offset 在 replication backlog 内）：
 1. Slave 发送 PSYNC &amp;lt;runid&amp;gt; &amp;lt;offset&amp;gt;
 2. Master 检查 offset 是否在 backlog 中
 3. 直接发送缺失部分的命令 → Slave 执行
 4. 无需全量 RDB，快速恢复
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="12-关键概念"&gt;1.2 关键概念&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;概念&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;runid&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Master 的唯一标识，重启后改变&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;offset&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;复制偏移量，Master 和 Slave 各自维护&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;replication backlog&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Master 的固定大小缓存区（默认 1MB），存储最近命令&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Replication Buffer&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;每个 Slave 连接的独立输出缓存&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看复制状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INFO replication
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# role:master&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# connected_slaves:2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# slave0:ip=192.168.1.2,port=6379,state=online,offset=123456,lag=0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# master_repl_offset:123456&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="13-配置"&gt;1.3 配置&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Slave 配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;replicaof 192.168.1.1 &lt;span class="m"&gt;6379&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;masterauth &amp;lt;password&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;replica-read-only yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 允许 Slave 处理过期 key（默认）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;replica-lazy-flush yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="2-sentinel-哨兵模式"&gt;2. Sentinel 哨兵模式&lt;/h2&gt;
&lt;h3 id="21-架构与职责"&gt;2.1 架构与职责&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; Client (连接 Sentinel 获取地址)
 │
 ┌───────────────┼───────────────┐
 │ │ │
Sentinel-1 Sentinel-2 Sentinel-3 (至少 3 个，奇数)
 │ │ │
 └───────────────┼───────────────┘
 │
 ┌─────▼─────┐
 │ Master │
 └─────┬─────┘
 ┌────────┴────────┐
 ┌────▼────┐ ┌────▼────┐
 │ Slave 1 │ │ Slave 2 │
 └─────────┘ └─────────┘

Sentinel 职责：
1. 监控：定时 ping Master/Slave/Sentinel
2. 通知：故障时通知管理员（通过脚本）
3. 自动故障转移：Master 宕机 → 选举新 Master
4. 配置提供：客户端向 Sentinel 询问当前 Master 地址
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="22-故障转移流程"&gt;2.2 故障转移流程&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1. Sentinel-1 发现 Master 无响应（主观下线，SDOWN）
2. 询问其他 Sentinel，多数同意 → 客观下线（ODOWN）
3. 选举 Leader Sentinel（Raft 算法）
4. Leader 选择最优 Slave 提升为 Master（选择优先级最高、复制最完整的）
5. 原 Slave 重新配置为新 Master 的 Slave
6. 客户端通过 Sentinel 获取新 Master 地址
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="23-sentinel-配置"&gt;2.3 Sentinel 配置&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# sentinel.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sentinel monitor mymaster 192.168.1.1 &lt;span class="m"&gt;6379&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sentinel down-after-milliseconds mymaster &lt;span class="m"&gt;5000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sentinel failover-timeout mymaster &lt;span class="m"&gt;60000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sentinel parallel-syncs mymaster &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sentinel auth-pass mymaster password
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;参数&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;monitor&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;监控的 Master，最后的 2 是「同意下线」的 Sentinel 数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;down-after-milliseconds&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;无响应判定为下线的时间&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;failover-timeout&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;故障转移超时&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;parallel-syncs&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;同时重新配置的 Slave 数&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="24-脑裂问题与解决"&gt;2.4 脑裂问题与解决&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 脑裂：网络分区时，原 Master 和 Sentinel 断开&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 原 Master 仍在写入，但已经不被 Sentinel 认可&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 分区恢复后，原 Master 的数据被覆盖 → 数据丢失&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 解决方案：主库最小从库数 + 延迟限制&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;min-replicas-to-write &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# 至少有 1 个 Slave 同步才能写入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;min-replicas-max-lag &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="c1"&gt;# Slave 延迟超过 10 秒则拒绝写入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="3-读写分离"&gt;3. 读写分离&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Spring Boot + Lettuce 读写分离&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Bean&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RedisConnectionFactory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;lettuceConnectionFactory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LettuceClientConfiguration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clientConfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LettuceClientConfiguration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ReadFrom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;REPLICA_PREFERRED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 优先从 Slave 读&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RedisStaticMasterReplicaConfiguration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RedisStaticMasterReplicaConfiguration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;master&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;slave1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;slave2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LettuceConnectionFactory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clientConfig&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 纯 Lettuce&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RedisClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RedisClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;redis://master:6379&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;StatefulRedisMasterReplicaConnection&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MasterReplica&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;StringCodec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UTF8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RedisURI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;redis://slave1:6379&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RedisURI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;redis://slave2:6379&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setReadFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ReadFrom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;REPLICA_PREFERRED&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="4-redis-60-多线程-io-对复制性能的影响"&gt;4. Redis 6.0+ 多线程 Io 对复制性能的影响&lt;/h2&gt;
&lt;p&gt;Redis 6.0 引入了多线程 Io 模型，该特性显著提升了高并发场景下的网络吞吐能力。虽然命令执行仍在主线程单线程进行，但网络读写可以被多个 Io 线程并行处理。对于主从复制场景，这意味着 Master 向多个 Slave 推送 RDB 和复制流时的网络瓶颈被大幅缓解。&lt;/p&gt;</description></item><item><title>Redis 持久化机制: RDB vs AOF</title><link>https://plumephp.com/redis-persistence/</link><pubDate>Fri, 14 Aug 2026 14:03:00 +0800</pubDate><guid>https://plumephp.com/redis-persistence/</guid><description>&lt;h2 id="1-为什么需要持久化"&gt;1. 为什么需要持久化&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Redis 是内存数据库，进程退出后数据全部丢失。&lt;strong&gt;持久化&lt;/strong&gt;将内存数据保存到磁盘，用于数据备份、灾难恢复和进程重启后的数据恢复。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="2-rdbredis-database快照"&gt;2. RDB（Redis Database）快照&lt;/h2&gt;
&lt;h3 id="21-触发方式"&gt;2.1 触发方式&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 手动触发&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SAVE &lt;span class="c1"&gt;# 同步保存，阻塞主线程（生产不用）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BGSAVE &lt;span class="c1"&gt;# 后台异步保存，fork 子进程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 自动触发（redis.conf）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;save &lt;span class="m"&gt;900&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# 900 秒内至少 1 个 key 变化 → 触发 BGSAVE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;save &lt;span class="m"&gt;300&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="c1"&gt;# 300 秒内至少 10 个 key 变化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;save &lt;span class="m"&gt;60&lt;/span&gt; &lt;span class="m"&gt;10000&lt;/span&gt; &lt;span class="c1"&gt;# 60 秒内至少 10000 个 key 变化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;save &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 禁用 RDB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="22-copy-on-write-原理"&gt;2.2 Copy-On-Write 原理&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;BGSAVE 执行时：

1. 主进程 fork() 子进程
 │
 ├── 父进程（Redis 主线程）──→ 处理客户端请求
 │ │
 │ 写入 key A ──→ 页面被修改 ──→ COW 复制页面
 │ │ │
 │ 新数据 ──→ 新页 旧页（子进程读取）
 │
 └── 子进程 ──→ 读取内存页 ──→ 写入 RDB 文件

COW 开销：fork 时只需复制页表，无需复制全部内存
 实际额外内存 ≈ 写入操作涉及的数据量
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="23-rdb-优缺点"&gt;2.3 RDB 优缺点&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;优点&lt;/th&gt;
					&lt;th&gt;缺点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;文件紧凑，备份和传输方便&lt;/td&gt;
					&lt;td&gt;可能丢失两次快照间的数据&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;恢复速度快（直接加载）&lt;/td&gt;
					&lt;td&gt;大数据量时 fork 可能耗时较长&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;对运行时性能影响小&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="3-aofappend-only-file"&gt;3. AOF（Append Only File）&lt;/h2&gt;
&lt;h3 id="31-写入策略"&gt;3.1 写入策略&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 同步策略&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;appendfsync always &lt;span class="c1"&gt;# 每条命令 fsync → 最安全，性能最差&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;appendfsync everysec &lt;span class="c1"&gt;# 每秒 fsync → 默认，最多丢 1 秒数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;appendfsync no &lt;span class="c1"&gt;# 由 OS 决定 → 最快，最不安全&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 在 rewrite 期间是否不 fsync（减少 IO 压力）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;no-appendfsync-on-rewrite yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="32-aof-重写rewrite"&gt;3.2 AOF 重写（Rewrite）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;AOF 持续追加会不断膨胀，重写将内存中的最新数据生成精简的命令集。&lt;/p&gt;</description></item><item><title>Go + Redis 实战：go-redis/v9 连接池、Pipeline 与事务</title><link>https://plumephp.com/redis-go-redis/</link><pubDate>Thu, 13 Aug 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/redis-go-redis/</guid><description>&lt;p&gt;Go 语言凭借简洁的语法、出色的并发模型与高效的运行时，在服务端开发领域占据重要位置。Redis 作为内存型键值数据库，以亚毫秒级延迟与丰富的数据结构成为缓存与实时数据存储的首选。将两者结合，能够构建出高性能、高可用的后端服务。本文基于 go-redis/v9 这一官方推荐的 Go Redis 客户端，系统讲解连接管理、数据操作、Pipeline 批量处理、乐观锁事务、Lua 脚本、发布订阅，并最终落地为带 TTL 和防穿透的 Cache-Aside 缓存封装，以及计数器/限流器实战项目。&lt;/p&gt;</description></item><item><title>Redis 分布式锁与原子操作：SET NX EX、Redlock 与 Lua 脚本</title><link>https://plumephp.com/redis-distributed-lock/</link><pubDate>Thu, 13 Aug 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/redis-distributed-lock/</guid><description>&lt;p&gt;在分布式系统中，多个进程或服务节点需要协调对共享资源的访问。Java 中常用的 &lt;code&gt;synchronized&lt;/code&gt; 关键字和 &lt;code&gt;ReentrantLock&lt;/code&gt; 只能在单个 JVM 内生效，无法跨越进程边界。Redis 分布式锁正是解决跨进程、跨机器互斥问题的经典方案。本文将深入剖析 Redis 分布式锁的完整技术体系，从基础的单实例实现到 Redlock 多节点算法，再到 Lua 脚本原子操作、看门狗续期机制以及 Go 语言的完整工程实现，帮助你系统掌握该技术在生产环境中的应用。&lt;/p&gt;</description></item><item><title>Redis 数据结构深度解析：SDS、ziplist、skipList 与编码转换</title><link>https://plumephp.com/redis-data-structures-deep-dive/</link><pubDate>Thu, 13 Aug 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/redis-data-structures-deep-dive/</guid><description>&lt;p&gt;Redis 之所以能在内存数据库领域长期占据统治地位，除了单线程的事件循环模型和高效的 I/O 多路复用之外，&lt;strong&gt;底层数据结构的精心设计&lt;/strong&gt;功不可没。Redis 的每个数据类型背后都不是一个简单的 Java HashMap 或者 C++ std::vector，而是一套经过反复打磨、针对内存场景极致优化的专用数据结构。理解这些结构的设计取舍，不仅有助于你写出更高效的代码，还能在面对 BigKey、慢查询、内存暴涨等线上问题时，快速定位根因并给出治理方案。&lt;/p&gt;</description></item><item><title>Redis 消息队列：Pub/Sub 广播与 Streams 持久化消息实战</title><link>https://plumephp.com/redis-pub-sub-streams/</link><pubDate>Thu, 13 Aug 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/redis-pub-sub-streams/</guid><description>&lt;p&gt;Redis 不只是缓存数据库，它在消息队列领域也占据重要位置。从早期的 Pub/Sub 发布订阅，到 Redis 5.0 引入的 Streams 流数据结构，Redis 提供了两种截然不同但各有适用场景的消息传递模型。本文将深入对比这两种方案的原理、命令、风险与实战用法，并给出与 Kafka、RabbitMQ 的专业选型对比。&lt;/p&gt;</description></item><item><title>Redis 生产安全指南：ACL 权限、TLS 加密与审计日志</title><link>https://plumephp.com/redis-security-production/</link><pubDate>Thu, 13 Aug 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/redis-security-production/</guid><description>&lt;p&gt;Redis 以高性能著称，但默认配置在生产环境中存在显著安全缺口：无认证、明文传输、无访问隔离。本文从威胁模型出发，系统讲解密码认证、ACL 权限体系、TLS 加密、网络加固、命令重命名、审计日志与 CVE 修复，帮助你构建一套可落地的 Redis 生产安全基线。&lt;/p&gt;</description></item><item><title>Redis 缓存设计模式：Cache Aside、穿透/击穿/雪崩防御</title><link>https://plumephp.com/redis-cache-patterns/</link><pubDate>Thu, 13 Aug 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/redis-cache-patterns/</guid><description>&lt;p&gt;在高并发系统中，Redis 缓存是缓解数据库压力、提升响应速度的核心组件。然而，引入缓存的同时也带来了一系列一致性、可靠性和高可用性的挑战。本文系统梳理四种经典缓存设计模式，并深入剖析缓存穿透、击穿、雪崩三大问题的成因与防御策略。&lt;/p&gt;</description></item><item><title>Redis 高可用架构：主从复制、Sentinel 故障转移与 Cluster 分片</title><link>https://plumephp.com/redis-cluster-ha/</link><pubDate>Thu, 13 Aug 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/redis-cluster-ha/</guid><description>&lt;p&gt;Redis 作为内存数据库，性能极高但单节点存在两个致命缺陷：一是单机故障导致服务中断，二是单节点内存容量和并发连接数存在上限。生产环境必须引入高可用架构。Redis 官方提供了三套递进式的方案：主从复制（Replication）、哨兵模式（Sentinel）和集群模式（Cluster）。本文深入剖析这三种架构的数据同步机制、故障检测与转移原理，以及槽分片与扩容缩容的完整流程。&lt;/p&gt;</description></item></channel></rss>