本文目录
可直接引用的结论:能重建的缓存不必搬,不能丢的状态不能继续假装是缓存
先按业务语义把键分成可从权威数据重建的缓存、可恢复但重建昂贵的派生数据、锁与限流等协调状态,以及会话、幂等记录、流程进度等不能随意丢失的共享状态。为每类键固定命名、值格式、版本、读写者、权威来源、TTL、容量与失败语义。纯缓存优先在新环境按需重建;必须接续的状态才做快照、增量追平或受控双写。切换期间同一业务范围只能有一个状态写入主责,锁和计数器不能被拆到两个互不知情的集群。只有过期时间、并发原子性、故障降级、回滚和旧入口退役都通过验收,迁移才算完成。
按键的业务语义选择迁移方式,不按数据库编号整库复制
| 数据类型 | 建议迁移路线 | 主要风险 |
|---|---|---|
| 可重建业务缓存 | 新环境空启动或限速预热,未命中时从权威数据读取并按新契约写入 | 把陈旧缓存整库复制,连同旧格式、脏值和错误 TTL 一起带入 |
| 昂贵派生结果 | 保留生成版本和来源水位,按热点或业务批次重算,并限制回源与重建并发 | 新集群冷启动同时触发大量查询、报表或 AI 处理任务 |
| 锁、配额与限流计数 | 按稳定路由把同一资源固定到一个协调主责,等待旧租约或窗口排空后再转移 | 新旧两侧各自判断成功,导致并发写入、超额执行或重复任务 |
| 会话、幂等与流程状态 | 先确认是否应进入权威存储;确需共享状态时按版本、TTL 和原子操作迁移并逐笔对账 | 把内存服务当永久数据库,遇到淘汰、过期或故障后无法恢复业务事实 |
适用边界:本文迁移的是共享数据语义,不只是更换 Redis 地址
本文面向维护 ERP、CRM、交易后台、任务平台、小程序或 APP 服务的架构、研发、测试和运维人员,适用于更换自建或托管缓存、拆分混用实例、升级集群形态,以及从进程内缓存迁到共享缓存。重点是业务连续性,不承诺迁移后必然降低成本或提升性能。
先明确触发原因:旧版本或部署方式停止支持、容量接近边界、单实例故障影响过大、多个系统互相污染、需要跨机房切换,还是为了统一运维。目标不同,迁移范围和验收证据也不同。仅需扩容时不一定要改变全部键模型;若真正问题是权威数据库慢、缓存一致性差或无界写入,更换产品也不会自动解决。
本文不把所有共享状态都留在缓存组件里。订单、金额、库存、审批结论和不可重复副作用等业务事实,应由具有明确持久性、约束与恢复方案的权威系统保护。登录会话的身份、撤销和客户端兼容另有专门指南;分布式锁也不能只靠复制键完成迁移。涉及资金、医疗、工业控制或监管留存时,还需按采用系统和适用要求设计专门验证。
- 写清迁移原因、范围、不可中断流程、允许丢失窗口和恢复目标。
- 区分缓存优化问题、共享状态治理问题与权威数据存储问题。
- 列出本次不迁移的客户端、键空间、业务周期及后续处置。
从调用者和业务后果出发,建立键、命令与容量清单
仅统计键数量和内存占用无法判断迁移风险。同一个实例可能同时保存商品缓存、用户会话、接口幂等键、分布式锁、限流计数、任务进度和消息去重记录,它们对丢失、重复和陈旧的容忍度完全不同。
按应用、环境和业务域记录命名模式、示例键、数据类型、序列化格式、值版本、创建者、读取者、更新命令、原子脚本、TTL 设置者、平均与峰值大小、访问分布、敏感等级、权威来源及缺失后的行为。代码搜索要与客户端连接配置、命令统计、慢日志、访问控制、任务脚本和实际流量交叉核对,避免遗漏低频月末任务、旧客户端或人工运维脚本。
使用 SCAN 类遍历工具盘点时要遵守产品语义。Redis 官方文档说明,完整迭代可返回重复元素,迭代期间发生变化的元素是否返回并不确定,COUNT 也只是工作量提示。因此盘点程序必须幂等、保留游标和批次统计,并用客户端清单、业务日志和多轮抽样补证;不能把一次在线扫描当作冻结快照,也不能在生产上直接使用可能长时间阻塞的全量操作。
- 输出键族、数据类型、值版本、读写者、命令、TTL、容量和权威来源清单。
- 为“键丢失、键陈旧、键重复、键永久存在”分别写出业务后果。
- 盘点工具限速、可续跑且不会记录完整敏感值或秘密。
建立键与值契约,把 TTL、原子性和失败语义写成版本
迁移中最容易漏掉的不是值本身,而是键名编码、序列化、过期方式和原子命令组合。新旧客户端若对这些约定理解不同,会产生互相看不见的状态或把短期键变成永久键。
为每个键族定义环境与业务命名空间、稳定业务标识、版本段、数据类型、字段含义、编码、最大大小、允许命令、更新前置条件和删除语义。需要原子判断并更新的流程,把条件、写入与 TTL 放进受测的事务或脚本边界,避免迁移适配层拆成多个网络往返。值格式升级采用显式版本和兼容窗口,不靠“解析失败就当未命中”掩盖状态丢失。
TTL 是数据契约的一部分。Redis 的 EXPIRE 文档说明,覆盖键内容的部分命令会清除已有超时,而原地修改某些数据结构的命令会保留超时;迁移程序若只复制值再统一补过期时间,可能延长会话、幂等窗口或锁的生命。记录绝对截止时间与剩余 TTL 的选择依据,处理复制耗时、时钟偏差、已过期键、无 TTL 键和重试。对必须过期的键,验收时主动检查永久键比例和最大剩余时间。
- 键契约包含命名、版本、类型、字段、大小、命令、TTL 与删除语义。
- 原子操作在新旧环境都有并发测试,不把多步客户端调用当成等价替代。
- 迁移保留业务截止含义,不因重跑反复延长 TTL。
按分类选择空启动、重算、回填或增量追平
整库复制看似简单,却会把无用缓存、临时锁、错误格式和过期策略一并搬走。迁移单元应是有共同语义和读写主责的键族,而不是整个逻辑数据库。
可重建缓存优先让新环境空启动:读取新缓存未命中后,从权威存储获取、校验业务版本并限速写入;高价值热点可依据已验证清单预热,但要限制并发、数据库查询和队列长度。Microsoft 的 Cache-Aside 官方说明明确指出该模式本身不保证数据存储与缓存一致,因此预热和回填仍要执行版本、失效和新鲜度规则,不能因为值来自旧缓存就当作权威事实。
必须接续的状态先重新判断存储归属。确需保留在共享状态服务时,固定快照或可解释水位,复制值、版本和截止时间,再用业务事件、变更日志或受控双写追平增量。双写只作为有截止日期的迁移机制:每次写入带操作标识和单调业务版本,记录两侧结果;失败进入可重放队列或阻止切换,不能默认重试后一定一致。锁、租约、限流窗口和并发计数通常不复制存量,而是把同一资源持续路由到旧主责,等待窗口安全排空后一次转到新主责。
- 纯缓存从权威来源按需重建,预热受数据库与下游容量预算约束。
- 状态回填记录水位、业务版本、截止时间和逐批差异。
- 协调状态通过稳定路由和排空转移,不让两个集群同时发放许可。
实施步骤:先统一访问层,再按业务范围转移唯一主责
迁移开关应位于能够稳定识别业务范围的访问层,例如一个键仓库、缓存适配器或网关,而不是散落在每个调用点。每次请求都能解释访问了哪一侧、依据哪个路由版本。
第一步完成清单、契约和容量基线;第二步让全部调用先经过访问层但仍只访问旧环境;第三步建立新环境的网络、权限、容量、持久化或淘汰策略和监控;第四步按分类空启动、回填或追平;第五步对无副作用读取做影子比较,对写入只记录计划或执行受控双写;第六步按租户、业务域或键族切换读取和唯一写入主责;第七步观察完整 TTL、限流窗口、任务周期和故障恢复;第八步停止旧写入、撤销客户端权限并在证据确认后退役旧数据。
回滚不是把所有流量指回旧地址。切换后只写入新环境的状态必须先定义回写、兼容读取或只能前滚的边界;已经发放的锁、配额和幂等结果也不能被旧环境重新发放。每个批次保存路由版本、键族、业务范围、数据水位、未决写入、开始时间、停止条件和负责人。回滚先恢复可逆读取,再按状态主责处理未决数据,不清空新集群来制造表面一致。
- 访问层输出有限路由与错误标签,不记录完整键值、会话或个人数据。
- 同一业务范围始终只有一个权威写入与协调主责。
- 回滚方案明确新产生状态、未决双写、旧客户端和不可逆副作用。
把淘汰、网络分区和冷启动当作业务故障来验证
缓存服务可连接不等于业务安全。内存限制、淘汰策略、客户端连接、热点键、序列化膨胀、持久化行为和故障切换都会改变新环境的有效容量与失败方式。
Redis 官方淘汰文档说明,达到 maxmemory 后会依据配置策略淘汰键或拒绝新增写入;“缓存副本可被淘汰”这一假设不适用于混入其中的流程状态。将可丢缓存与不可丢状态至少按实例、策略和权限边界隔离,为每类数据设置容量、过期和拒绝语义。容量评估同时包含键和值、元数据、复制或持久化缓冲、客户端输出缓冲及故障期间余量,以实际部署文档和受控测试为准,不把 maxmemory 简化成进程总内存承诺。
故障演练覆盖旧或新环境超时、连接中断、部分双写失败、主从或分片切换、热键、内存水位、淘汰、写入拒绝、时钟异常、冷启动和权威数据源降速。对可重建缓存,验证回源总量、合并重建和降级;对共享状态,验证系统选择拒绝、只读或持久队列,而不是静默当成未命中继续业务。AI 智能体、小程序、APP、后台任务和人工脚本都要经过同一访问层与权限策略,避免主 Web 路径切换后仍有旁路写旧集群。
- 缓存与不可丢状态的容量、淘汰和访问权限分开管理。
- 故障测试核对业务结果、回源压力和恢复过程,不只看实例健康。
- 所有端和任务共享迁移路由,旧连接与旁路脚本可被发现和拒绝。
验收与风险:按业务语义对账,并证明旧键空间可以安全退役
缓存迁移不能只比较总键数。过期键随时间变化,纯缓存本就允许缺失,而锁和状态即使数量相同也可能属于不同业务版本。验收要对每类键采用与其语义匹配的证据。
纯缓存抽样比较权威数据、业务版本、新鲜度和缺失后的重建结果;派生数据核对来源水位与生成版本;状态类按业务标识逐笔检查值版本、截止时间和最终处理结果;锁与计数器通过并发和窗口测试证明没有双重许可。上线指标包括分侧读写量、未命中绝对数、回源并发、重建失败、值解析错误、无 TTL 键、双写差异、淘汰与拒绝、热点分布和旧客户端连接。阈值与观察周期按实际业务周期约定,不编造统一比例。
主要风险包括漏盘点低频调用者、在线扫描误当快照、复制时延长 TTL、双写乱序覆盖新值、读回退把旧值重新灌入新环境、两个集群分别发锁、冷启动压垮数据库、淘汰状态键、回滚复活已失效会话或幂等记录,以及旧凭据长期保留。退役前从代码、配置、网络连接、访问日志、账号权限和运维手册反向证明旧环境没有合法读写;保留所需审计和备份,但不能让只读备份继续被应用当作在线状态源。
- 每类键按权威来源、业务版本、TTL 和并发语义选择验收方法。
- 故障、恢复、切换和回滚均有可重复步骤、停止条件与负责人。
- 旧连接归零、凭据撤销、告警稳定和数据留存批准后再执行退役。
需求讨论中的问题
可以直接把旧 Redis 的所有键复制到新集群吗?
不建议默认整库复制。纯缓存通常应从权威数据重建,锁和限流计数不能简单复制,状态类还要保留版本、TTL、原子语义和增量变化。只有完成分类后,才知道哪些键需要复制以及如何对账。
新旧缓存双写一段时间,就一定能平滑切换吗?
不能。双写可能部分失败、乱序或因重试覆盖较新的值。它只能是有期限的迁移机制,需要操作标识、版本保护、差异记录和失败补偿;同一业务范围仍应有明确的权威写入主责。
为什么迁移后会出现本应过期的永久键?
常见原因是迁移程序只复制值没有复制截止时间,或覆盖键的命令清除了原 TTL,随后补设 TTL 又失败。应把过期语义纳入同一受测写入流程,并持续检查必须过期键中的永久键比例。
缓存丢了可以回源,是否不需要做故障演练?
仍然需要。大量同时未命中可能把数据库或下游服务压垮;某些所谓缓存还混有会话、幂等或流程状态。演练要证明回源总量受控、重建可合并、降级可解释,并确认不可丢状态不会被当成普通未命中。
回滚时把流量全部切回旧集群就可以吗?
只有在旧侧仍拥有完整且最新状态时才可能成立。若切换后产生了新会话、幂等记录、任务进度或配额结果,盲目回切会复活旧状态或重复执行。必须预先设计回写、兼容读取或只能前滚的边界。
AI 智能体可以直接读取共享缓存完成业务操作吗?
不应把底层键空间当作稳定业务接口。智能体应通过有授权、校验和审计的业务工具访问必要状态,避免绕过租户、权限、版本和迁移路由,也不要把完整键值或敏感会话交给模型。
旧系统缓存与共享状态迁移上线验收清单
可逐项勾选,辅助本次阅读;刷新页面后不保留。
参考资料
技术概念可进一步阅读以下资料;文中的业务场景与实施清单用于方案讨论。
- Redis Docs · SCAN
核对游标迭代、完整迭代保证、重复元素、并发变化元素的不确定性以及 COUNT 只是提示等官方语义。
- Redis Docs · EXPIRE
核对过期键、覆盖命令可能清除 TTL、原地修改可能保留 TTL、条件设置和过期时间的官方语义。
- Redis Docs · Key eviction
核对 maxmemory、淘汰或拒绝策略及复制和持久化缓冲等容量边界;实际配置仍以采用版本和部署方式为准。
- Microsoft Azure Architecture Center · Cache-Aside pattern
核对按需加载、过期策略、并发与可用性边界,以及 Cache-Aside 不自动保证权威数据与缓存一致。
旧 Redis 里混着缓存、会话、锁和任务状态?
提供脱敏后的连接拓扑、键族、TTL、命令、容量与故障现象,月弦科技可以协助完成数据分级、访问层改造、迁移批次、对账和回滚方案。