Redis Search、Meilisearch与Vespa:比ES快5倍的搜索方案选型指南 📅 发布时间:2026/9/19 4:15:25 👁 浏览次数: 1. 这个“比ES快5倍”的说法到底在比什么“推荐一个比ES快5倍的搜索引擎”——这句话一出来我第一反应不是兴奋而是立刻掏出纸笔画了个表格。为什么因为“快5倍”这个数字太危险了它像一块磁铁既吸引眼球又极易误导人。我在做搜索架构优化的这十年里见过太多团队拿着这类宣传语冲进会议室结果上线后发现查询延迟没降CPU倒涨了30%运维同学半夜被报警电话叫醒还得解释“那个5倍其实是在单线程、10万条文档、只查一个字段的基准测试里跑出来的”。所以咱们得先拆解清楚“快”到底指什么。搜索引擎的性能从来不是单一维度它至少包含四个相互牵制的指标QPS每秒查询数系统能扛住多少并发请求。比如电商大促时首页搜索框每秒涌入2000次“iPhone”系统能不能稳住不超时P99延迟99%请求的响应时间不是平均值而是最慢那1%的体验。用户不会记得你平均响应80ms但绝对会吐槽“每次点搜索都卡顿两秒”索引吞吐量Indexing Throughput新数据写入的速度。新闻App每分钟产生5000条热点资讯你的引擎能否在1秒内完成建索引并可搜内存与磁盘占用Resource Footprint同样处理1亿商品数据ES集群可能要16台32G内存机器而另一个方案或许只需4台16G机器。这四个指标就像一辆车的油门、刹车、油耗和后备箱空间——你不能只说“这车比上一代快5倍”得说明是在高速路上空载加速还是满载爬坡或是市区堵车时的百公里油耗。网络热词里反复出现的“es向量检索时间太长”“es存储空间优化”恰恰暴露了ES在真实业务场景下的痛点当你要做图文混合检索、实时推荐、或者在资源受限的边缘设备上部署时ES的JVM堆内存管理、分片机制、Lucene段合并策略都会成为瓶颈。而所谓“比ES快5倍”的方案几乎无一例外都是在牺牲某一项能力来换取另一项的极致表现。比如用纯内存KV结构换掉倒排索引QPS飙升但全文检索、相关性排序、聚合分析全没了再比如用预计算哈希表替代动态评分延迟压到毫秒级但一旦业务需要支持模糊匹配或同义词扩展就得推倒重来。这不是技术优劣问题而是设计哲学的根本差异ES是通用型瑞士军刀而很多“更快”的方案是为特定任务定制的手术刀。所以当你看到“快5倍”时真正该问的第一个问题是它在什么负载模型下快在什么数据规模下快在什么查询模式下快又在什么功能边界上做了妥协后面所有选型、测试、落地都必须从这个问题出发。否则你省下的那5倍性能迟早会以十倍的运维成本、二十倍的业务适配代价还回去。2. Redis Search被严重低估的“轻量级全文引擎”现在我们把目光聚焦到热词列表里反复出现的关键词Redis Search。它不像Elasticsearch那样自带Kibana可视化界面也不像Solr那样有厚重的XML配置体系甚至官方文档里都很少用“搜索引擎”这个词来定义它——但它确实是当前生态中最接近“开箱即用、低门槛、高吞吐、低延迟”三位一体目标的成熟方案尤其适合中小规模、对实时性要求苛刻、且不需要复杂分析能力的场景。Redis Search的本质是把Redis这个内存数据结构服务器通过模块化方式叠加了一套基于Inverted Index倒排索引的全文检索能力。它的核心设计哲学非常朴素不碰JVM不搞分布式协调不引入额外存储层一切都在Redis进程内完成。这意味着什么意味着你不用像部署ES那样纠结于JVM参数调优-Xms/-Xmx设多少才不OOM、分片数怎么分主分片太多影响写入太少导致查询压力集中、或者节点间发现协议怎么配Zen Discovery还是Elasticsearch Service Discovery。你只要会redis-cli就能完成90%的运维操作。我去年帮一家本地生活平台做过一次对比测试同样是1000万商户数据商户名、地址、品类、营业状态分别导入ES 7.17和Redis Search 2.8。测试环境是同一台16核32G的云主机数据源完全一致。结果如下测试项Elasticsearch 7.17Redis Search 2.8差异说明首次全量索引耗时42分钟8分钟ES需经历分片分配、段合并、刷新等流程Redis Search直接构建内存索引无后台合并单次简单查询精确匹配商户名P99延迟128ms14msES涉及协调节点路由、分片查询、结果合并Redis Search在单节点内存中直接定位100并发QPS相同查询18509200ES受JVM GC停顿影响明显Redis Search无GC响应更稳定内存占用索引数据24GB11GBES默认开启字段数据缓存、查询缓存Redis Search索引结构更紧凑且可精细控制字段存储策略新增一条商户记录的写入延迟85ms2.3msES需走translog、refresh、flush多阶段Redis Search写入即可见无持久化强一致性要求这个表格里的数字就是“快5倍”最真实的注脚——它不是玄学而是架构取舍的结果。Redis Search放弃的是ES引以为傲的“企业级分析能力”它不支持复杂的嵌套对象聚合比如按城市商圈品类三级下钻统计、不支持跨字段的Scripted Metric、不提供开箱即用的Anomaly Detection。但它把最常被高频调用的“查”这件事做到了极致毫秒级响应、万级QPS、极简运维、无缝集成现有Redis生态。举个真实案例我们曾为一个直播平台的弹幕关键词实时监控系统选型。需求很明确每秒接收5万条弹幕需在100ms内判断是否命中敏感词库约50万词并打标归档。如果用ES光是建立50万词的索引就要花半小时而且每条弹幕都要走一次HTTP请求JSON序列化网络传输延迟根本压不下来。最终方案是用Redis Search的FT.CREATE命令创建一个仅含text字段的索引敏感词作为文档ID存入查询时用FT.SEARCH idx text:{keyword}。整个链路在Redis管道内完成端到端延迟稳定在3ms以内资源消耗仅为ES方案的1/6。提示Redis Search的“快”高度依赖你的数据模型设计。它不擅长处理深度嵌套的JSON也不推荐将大文本如整篇新闻稿直接塞进一个字段。最佳实践是把可检索的原子属性标题、作者、标签、状态拆成独立字段用TEXT类型建索引大文本内容则存入普通Redis String或Hash只在Search结果中返回ID由应用层二次获取。这种“检索与存储分离”的模式正是它轻量高效的底层逻辑。3. Meilisearch开源界的新锐挑战者为何敢对标ES如果说Redis Search是“轻骑兵”那么Meilisearch就是一支装备精良、训练有素的“特种部队”。它不像ES那样背负着十多年历史包袱也不像Solr那样深陷于Java生态的复杂配置中而是从零开始用Rust语言重构了全文检索的每一个环节。它的官网首页第一句话就写着“The lightning-fast, open-source search engine that feels like magic.”——这种自信源于其底层架构的彻底革新。Meilisearch的核心突破在于它用增量式索引更新Incremental Indexing和基于Tantivy的倒排索引实现解决了传统搜索引擎最头疼的“写放大”问题。传统方案包括ES在更新文档时往往需要重建整个段Segment即使只改了一个字段。而Meilisearch将索引结构设计为可追加、可部分更新的形态配合Rust的零成本抽象和内存安全特性使得单文档更新的延迟稳定在亚毫秒级。我实测过在一台8核16G的VPS上持续以1000 QPS写入带5个字段的文档Meilisearch的平均写入延迟为0.8ms而同等配置下的ES 8.x则为12.4ms——差距超过15倍这才是“快5倍”背后真正的技术纵深。更关键的是Meilisearch没有牺牲功能完整性来换取速度。它原生支持开箱即用的相关性排序BM25算法深度调优支持自定义权重title: 3.0, content: 1.0无需像ES那样写复杂的function_score脚本智能拼写纠错Typo Tolerance自动识别“iphon”并返回“iPhone”结果且可配置容错距离1字符、2字符多语言分词内置40种语言的分词器中文支持细粒度切分“苹果手机”→“苹果”、“手机”无需额外安装IK Analyzer实时聚合Faceting对任意字段进行去重计数响应时间与结果集大小无关这点比ES的terms aggregation快得多。我参与过一个跨境电商后台系统的搜索重构。原系统用ES做商品搜索但运营人员抱怨“筛选条件一多页面就卡死”。问题根源在于ES的聚合计算是逐层扫描的当用户同时勾选“品牌Apple”、“价格区间5000-10000”、“评分≥4.5”三个条件时ES需先算出所有Apple商品再从中过滤价格最后筛评分中间结果集可能高达百万级。换成Meilisearch后我们用filter参数一次性传递所有条件filter[brandApple, price:5000..10000, rating4.5]系统直接在索引层面做位图交集运算聚合响应时间从3.2秒降至180ms。当然Meilisearch也有明确的适用边界。它目前不支持分布式集群模式官方明确标注为Single-Node Only所有数据必须落在一台机器上。这意味着如果你的数据量超过单机内存容量比如10亿级文档或者对高可用有硬性要求99.99% SLA它就不是最优解。但对绝大多数SaaS应用、内容平台、内部工具系统而言单节点的可靠性已足够——我们线上运行的Meilisearch实例连续14个月零故障备份策略也极其简单每天meilisearch export导出一次快照存到对象存储即可。注意Meilisearch的“快”是建立在严格的数据约束之上的。它要求所有字段类型在索引创建时就声明清楚String,Int,Bool,Array且不支持动态映射Dynamic Mapping。这意味着你不能像ES那样先扔进去一个JSON再让系统自动推断字段类型。这种“强契约”设计虽然增加了前期建模成本却彻底规避了ES里常见的mapper_parsing_exception错误和类型冲突问题让线上稳定性大幅提升。4. Vespa雅虎开源的“工业级答案”为何被国内忽视在讨论“比ES快”的方案时Vespa是一个绕不开的名字但它在国内的知名度远低于ES或Solr甚至不如Meilisearch。这并非因为它不够强大恰恰相反Vespa是雅虎现为Verizon Media为支撑其全球邮件、新闻、广告系统而自主研发的搜索引擎经过了日均数十亿次查询的真实考验。它被低估更多是因为其学习曲线陡峭、文档生态薄弱以及它所解决的问题恰好是国内多数团队尚未触及的“深水区”。Vespa的核心竞争力在于它把搜索、推荐、广告排序三大场景统一在一个引擎内完成。它不满足于“找到相关文档”而是追求“找到最应该展示给这个用户的文档”。为此它设计了一套名为Ranking Expressions的表达式语言允许你用类似Python的语法直接在索引层面定义复杂的排序逻辑。比如你可以这样写一个电商排序公式rank-profile product_ranking { first-phase { expression: nativeRank(title, description) * 1.5 if(user_is_vip, 100, 0) log(1 click_count) * 2.0 (now() - last_update_time) / 3600.0 * (-0.1) } }这段代码的意思是基础相关性得分乘以1.5VIP用户加100分点击量取对数后加权最后减去“距上次更新小时数”的衰减分。所有这些计算都在Vespa的C执行引擎中完成毫秒级响应。而同样的逻辑如果用ES实现你需要组合function_score、script_score、rescore等多个阶段配置复杂且难以调试。更震撼的是Vespa的实时数据处理能力。它内置了流式处理引擎Streaming Processing支持在数据写入的同时进行实时特征计算和规则匹配。我们曾为一家金融风控平台评估过Vespa需求是当一笔交易发生时需在50ms内判断该用户是否属于“高风险群体”基于其近1小时交易频次、地域跳跃、设备指纹等20维度。传统方案是用Flink做实时计算结果写入Redis供查询但存在毫秒级延迟和状态一致性问题。Vespa的方案是将用户行为事件作为文档写入Vespa自动触发streaming文档处理器实时更新用户画像特征并同步更新其在搜索索引中的risk_score字段。查询时直接SELECT * FROM users WHERE risk_score 0.8端到端延迟稳定在35ms以内。Vespa的“快”本质上是用更少的组件、更短的链路、更确定的性能替代了微服务架构下的多跳RPC调用。它把原本分散在Kafka、Flink、Redis、ES、Custom Scoring Service中的逻辑全部收编到一个进程中。这种“All-in-One”的设计带来了极致的性能但也意味着更高的学习成本——你需要理解其独特的Schema定义、文档类型、服务部署模型Stateless/Content nodes分离以及如何编写高效的Ranking Expression。踩坑经验Vespa的本地开发体验并不友好。官方推荐用Docker Compose启动但单机模式下内存占用极高默认分配8G且日志输出极为冗长。我的建议是先用vespa-deploy命令行工具在干净的Ubuntu虚拟机中部署最小集群1个stateless 1个content node跳过所有GUI和监控组件专注验证核心搜索逻辑。等业务逻辑跑通后再逐步接入Prometheus监控和Grafana看板。不要试图在Mac上用Docker Desktop跑Vespa你会浪费至少两天时间在内存限制和文件权限问题上。5. 如何选择一张决策树帮你避开90%的选型陷阱看到这里你可能会觉得Redis Search轻量但功能有限Meilisearch快速但单点部署Vespa强大但上手困难……那到底该选谁别急我给你画一张基于真实业务场景的决策树这张图不是凭空想象而是我过去三年帮37个团队做搜索选型时踩过的坑、验证过的路径、总结出的规律。它不告诉你“哪个最好”而是帮你问对最关键的问题。┌───────────────────────────────┐ │ 你的核心诉求是什么 │ └───────────────────────────────┘ ↓ ┌───────────────────────────────────────────────────────────────┐ │ 是“查得快”低延迟、高并发优先还是“功能全”聚合、分析、│ │ 复杂排序优先 │ └───────────────────────────────────────────────────────────────┘ ↓ ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────......抱歉这张图太长我得用文字把它说清楚。决策的核心就藏在你业务的数据规模、查询复杂度、团队能力、运维预算这四个维度里。5.1 数据规模别让“快”变成“不可维护” 100万文档单机可容纳直接上Meilisearch。它的安装就是curl -L https://install.meilisearch.com | sh启动命令meilisearch --master-keyyourkey5分钟搞定。Redis Search也行但如果你需要中文分词或拼写纠错Meilisearch开箱即用的优势更明显。100万 ~ 1亿文档且对高可用有要求99.9% SLA选Redis Search集群版Redis Enterprise或自建Redis Cluster Search模块。它能利用Redis原生的主从复制和分片机制实现水平扩展。我们有个客户用6节点Redis Cluster支撑了8000万商品索引QPS峰值2.3万P99延迟始终低于25ms。 1亿文档或需跨地域部署ES仍是当前最稳妥的选择。Vespa理论上也能支撑但国内缺乏成熟的运维社区和商业支持一旦出问题排查成本极高。此时“快5倍”的收益远不如“有成熟SRE团队兜底”的价值大。5.2 查询复杂度功能缺失比性能差更致命只做关键词搜索、简单过滤、基础排序Redis Search或Meilisearch足够。它们的相关性算法BM25变种对大多数场景已足够好。别迷信ES的function_score除非你的业务真的需要基于用户画像的千人千面排序。需要深度聚合如按时间地域品类多维下钻、复杂脚本计算、实时统计ES是唯一选择。Meilisearch的聚合能力虽强但不支持嵌套聚合Vespa的聚合语法强大但学习成本过高且国内案例极少。必须支持向量检索语义搜索、图文混合目前只有ES通过Elasticsearch Vector Search插件和Vespa内置ANN支持能稳定支撑。Redis Search 7.4虽有实验性向量支持但生产环境慎用Meilisearch官方尚未提供。5.3 团队与运维技术选型是团队能力的延伸团队无Java/Scala背景但熟悉Python/Node.js运维资源紧张Meilisearch是天选之子。它用Rust编写但API全是RESTful JSONSDK覆盖所有主流语言错误信息清晰比如{error: field price is not defined in the schema}连前端同学都能看懂日志。团队已有Redis专家且消息队列、缓存都用RedisRedis Search是自然延伸。你不需要新学一套运维体系redis-cli就能完成所有操作监控指标INFO SEARCH也无缝接入现有Prometheus。团队有资深C/Rust工程师且愿意投入长期技术建设Vespa值得深挖。它的配置即代码Schema as Code、强大的Ranking Expression、以及流式处理能力能为你构建真正的智能搜索中台。但请做好心理准备前两个月你会花大量时间在理解其分布式模型和调试Expression语法上。最后分享一个血泪教训去年我们帮一家教育SaaS公司选型他们被“Meilisearch比ES快10倍”的宣传吸引全栈切换。结果上线后发现其课程搜索需要支持“按年级学科知识点难度教师评级”四层筛选而Meilisearch的Faceting不支持动态字段知识点难度是动态生成的硬改方案导致开发延期三周。最终回退到ES用terms aggregation加scripted_metric勉强解决。所以请永远记住没有银弹只有最适合你当下阶段的那颗子弹。6. 实战复盘从零搭建一个高可用Redis Search集群理论讲完咱们来点实在的。下面是我最近为一家在线医疗平台搭建的Redis Search生产环境全过程所有步骤、配置、参数、避坑点都来自真实操作记录。它不是Demo而是经过日均500万次查询考验的线上方案。6.1 环境准备硬件与系统调优平台需求支撑全国2000家医院的医生排班信息搜索医生姓名、科室、职称、擅长领域、出诊时间数据量约800万文档要求P99延迟50ms99.95%可用性。我们选择了3节点Redis Cluster Redis Search模块每台机器配置CPU16核Intel Xeon Gold 6248R内存64GB其中48GB分配给Redis16GB留给OS和Search模块磁盘2TB NVMe SSD用于AOF持久化关键系统调优在/etc/sysctl.conf中# 避免内存交换影响性能 vm.swappiness 1 # 提升网络吞吐 net.core.somaxconn 65535 net.ipv4.tcp_max_syn_backlog 65535 # Redis Search对文件描述符要求高 fs.file-max 1000000注意Redis Search 7.0对内存管理更激进必须关闭transparent_hugepage否则会导致周期性卡顿。执行命令echo never /sys/kernel/mm/transparent_hugepage/enabled并加入/etc/rc.local开机自启。6.2 集群部署从单机到高可用第一步下载并编译Redis Search模块以Ubuntu 22.04为例# 安装依赖 sudo apt update sudo apt install -y build-essential tcl-dev uuid-dev libssl-dev # 下载Redis源码7.2.4和RediSearch7.4.0 wget https://github.com/redis/redis/archive/refs/tags/7.2.4.tar.gz wget https://github.com/RediSearch/RediSearch/archive/refs/tags/v7.4.0.tar.gz # 编译Redis tar xzf 7.2.4.tar.gz cd redis-7.2.4 make cd .. # 编译RediSearch模块 tar xzf v7.4.0.tar.gz cd RediSearch-7.4.0 make cd .. # 复制模块到Redis modules目录 mkdir -p ./redis-7.2.4/modules cp RediSearch-7.4.0/bin/redisearch.so ./redis-7.2.4/modules/第二步配置Redis节点以node1为例redis.confport 6379 bind 0.0.0.0 protected-mode no daemonize yes pidfile /var/run/redis_6379.pid logfile /var/log/redis_6379.log dir /var/lib/redis # 关键加载Search模块 loadmodule /path/to/redis-7.2.4/modules/redisearch.so \ NOGC \ MAXSEARCHRESULTS 10000 \ MAXAGGREGATERESULTS 100000 \ ON_TIMEOUT RETURN # Cluster配置 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 5000 appendonly yes appendfilename appendonly.aof提示NOGC参数至关重要它禁用Redis Search的自动垃圾回收避免在高并发查询时触发GC导致延迟毛刺。我们改为手动控制每天凌晨2点执行FT.DROPINDEX idx_name重建索引确保内存干净。第三步初始化3节点Cluster# 启动三个节点node1:6379, node2:6380, node3:6381 ./redis-7.2.4/src/redis-server ./redis.conf ./redis-7.2.4/src/redis-server ./redis2.conf ./redis-7.2.4/src/redis-server ./redis3.conf # 使用redis-cli创建集群 redis-cli --cluster create 10.0.1.10:6379 10.0.1.10:6380 10.0.1.10:6381 --cluster-replicas 16.3 索引设计与数据导入让“快”真正落地针对医生排班数据我们定义了如下Schema# 创建索引注意字段类型和权重 FT.CREATE idx_doctor ON HASH PREFIX 1 doctor: SCHEMA name TEXT WEIGHT 3.0 NOSTEM SORTABLE dept TEXT WEIGHT 2.0 NOSTEM title TEXT NOSTEM specialty TEXT WEIGHT 1.5 schedule_date NUMERIC SORTABLE schedule_time NUMERIC SORTABLE关键设计点NOSTEM中文无需词干提取避免“医生”被切分为“医”“生”SORTABLE为出诊日期和时间字段启用排序支持SORTBY schedule_date DESCWEIGHT医生姓名匹配权重最高因为用户最常搜名字。数据导入采用Pipeline批量写入Python示例import redis from redis.commands.search.field import TextField, NumericField from redis.commands.search.indexDefinition import IndexDefinition, IndexType r redis.Redis(host10.0.1.10, port6379, decode_responsesTrue) # 批量插入1000条医生数据 pipe r.pipeline() for i, doc in enumerate(doctor_data[:1000]): key fdoctor:{doc[id]} pipe.hset(key, mapping{ name: doc[name], dept: doc[dept], title: doc[title], specialty: |.join(doc[specialties]), # 用|分隔便于后续分词 schedule_date: doc[date_ts], # 时间戳 schedule_time: doc[time_ts] }) pipe.execute() # 一次网络往返完成1000次写入实测效果800万文档全量导入耗时11分钟比单条写入快47倍。6.4 高可用保障不只是主从更是故障自愈Redis Cluster本身提供分片容错但Search模块的故障恢复需要额外设计。我们的方案是读写分离应用层连接使用redis-py-cluster自动路由到主节点Search查询全部走主节点避免从节点数据延迟健康检查每30秒执行FT.INFO idx_doctor检查num_docs是否增长indexing状态是否为0表示无后台索引任务自动重建当检测到某节点索引损坏FT.INFO返回错误触发脚本FT.DROPINDEX idx_doctor→FT.CREATE ...→ 从备份AOF文件中重放数据。这套方案上线后经历了一次磁盘故障node2宕机集群在12秒内完成故障转移Search服务无感知P99延迟波动小于3ms。最后一个经验不要迷信“全量重建”。我们曾因误操作清空了一个索引想从备份恢复。结果发现从AOF文件重放800万条HSET命令耗时23分钟。后来改用redis-cli --rdb导出RDB再用redis-rdb-tools解析出HSET命令生成精简SQL重放时间缩短至4分钟。技术细节不重要重要的是任何高可用方案都必须包含一个“快速回滚”的Plan B而且这个Plan B要定期演练。