再也不用为搜索单装 ES 了!Redis 官方这个模块,2 核 4G 跑出 12.5K QPS
这是一个或许对你有用的社群 一对一交流/面试小册/简历优化/求职解惑欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料《项目实战视频》从书中学往事上“练”《互联网高频面试题》面朝简历学习春暖花开《架构 x 系统设计》摧枯拉朽掌控面试高频场景题《精进 Java 学习指南》系统学习互联网主流技术栈《必读 Java 源码专栏》知其然知其所以然这是一个或许对你有用的开源项目国产Star破10w的开源项目前端包括管理后台、微信小程序后端支持单体、微服务架构RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRM、AI大模型、IoT物联网等功能多模块https://gitee.com/zhijiantianya/ruoyi-vue-pro微服务https://gitee.com/zhijiantianya/yudao-cloud视频教程https://doc.iocoder.cn【国内首批】支持 JDK17/21SpringBoot3、JDK8/11Spring Boot2双版本反向定位90% 项目其实不需要 ES横向对比4 个搜索方案怎么选性能实测吞吐 4 倍、内存 1/10Docker 一行装4 条命令验证Java 接入Jedis 4.0 直接用4 个真实使用边界最后说一句反向定位90% 项目其实不需要 ESJava 项目里只要谈到「搜索」不假思索的答案永远是 ES——上 Elasticsearch、Logstash、Kibana 三件套。这个组合是好但它为大数据规模的全文检索 / 日志分析而设计。90% 的中后台项目其实只要商品名 / 文章标题模糊搜索几张表的中文分词检索类目过滤 关键词组合查询偶尔的同义词、拼写纠错。这种规模上 ES 是「拿火箭炮打蚊子」——一台 ES 节点起步要 1 GB 内存多语言、聚合、分布式、副本、shard 一整套配下来你大半都用不到。真正的痛点是你要为搜索单独维护一个 ES 集群、配 IK 分词、写同步脚本、跟着业务表迭代 mapping。直接给方案Redis 官方推出的搜索模块RediSearch——它不是「另一个搜索引擎」而是 Redis 的一个 module跟着 Redis 实例一起跑没有额外服务、没有额外集群。对已经在用 Redis 的项目等于零运维成本接入全文搜索。基于 Spring Boot MyBatis Plus Vue Element 实现的后台管理系统 用户小程序支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能项目地址https://github.com/YunaiV/ruoyi-vue-pro视频教程https://doc.iocoder.cn/video/横向对比4 个搜索方案怎么选不是所有搜索场景都该上 RediSearch。先看自己在哪个象限方案数据规模内存占用中文分词致命短板MySQLLIKE/MATCH AGAINST 50 万行几乎为 0弱百万级以上性能崩PostgreSQL FTS 500 万行数据库自带需插件仍是关系库全文不是它强项Elasticsearch千万 ~ 数亿行1 GB 起IK 分词成熟重运维、单独集群、内存吃满RediSearch本文百万 ~ 千万行100 MB 量级内置中文集群版仅 Redis 企业版开源版单机判断很简单数据 50 万行、查询不频繁MySQL FULLTEXT 即可别造方案已经用 Redis、数据百万到千万、单机够用RediSearch 性价比最高真正的大数据 / 复杂聚合 / 多副本 / 分布式ES 还是必选一个新项目、想要现代搜索体验MeiliSearch / Typesense 也值得看。基于 Spring Cloud Alibaba Gateway Nacos RocketMQ Vue Element 实现的后台管理系统 用户小程序支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能项目地址https://github.com/YunaiV/yudao-cloud视频教程https://doc.iocoder.cn/video/性能实测吞吐 4 倍、内存 1/10官方做了一组对比测试机器配置数据源同样的语料导入RediSearch 配置Elasticsearch 配置版本索引构建RediSearch 221 秒 vs Elasticsearch 349 秒领先 58%查询吞吐32 客户端并发跑两词搜索——RediSearch 12.5K ops/secES 仅 3.1K ops/sec4 倍差距延迟 8 ms vs 10 ms最关键的是内存低配 2 核 4 GB 服务器上Redis Stack 镜像Redis RediSearch 模块总内存占用不到 100 MBES 实例至少 1 GB。原本要单独申请一台 ES 服务器的预算现在零成本搞定。RediSearch 2.0 比 1.6 又把吞吐和延迟提升了 2.4 倍。Docker 一行装4 条命令验证装docker run -d --name redis-stack-server -p 6379:6379 redis/redis-stack-server:latest # 带密码版 docker run -e REDIS_ARGS--requirepass redis-stack \ -p 6379:6379 redis/redis-stack:latest验证模块装好redis-cli -h localhost MODULE list 3) 1) name 2) search 3) ver 4) 20809看到search模块即装好。4 条核心命令完成搜索全流程# 1. 创建索引hash 数据源、中文分词、goodsName 字段可排序 FT.CREATE idx:goods ON HASH PREFIX 1 goods: \ LANGUAGE chinese SCHEMA goodsName TEXT SORTABLE OK # 2. 写入数据直接 hset索引自动构建 HSET goods:1001 goodsName 小米手机 HSET goods:1002 goodsName 华为手机 # 3. 搜索 FT.SEARCH idx:goods 手机 1) 2 2) goods:1001 3) 1) goodsName 2) 小米手机 4) goods:1002 5) 1) goodsName 2) 华为手机 # 4. 删索引不删源数据 FT.DROPINDEX idx:goodsLANGUAGE chinese指定中文分词SORTABLE让字段可排序。不指定LANGUAGE chinese中文检索就退化成单字匹配搜索质量直接报废。Java 接入Jedis 4.0 直接用Jedis 4.0 内置 RediSearch 客户端不用额外引依赖Bean public UnifiedJedis unifiedJedis(GenericObjectPoolConfig poolConfig) { if (StringUtils.isNotEmpty(password)) { return new JedisPooled(poolConfig, host, port, timeout, password, database); } return new JedisPooled(poolConfig, host, port, timeout, null, database); }创建索引与 SQL 建表对应Schema schema new Schema() .addSortableTextField(goodsName, 1.0) .addSortableTagField(tag, |); IndexDefinition rule new IndexDefinition(Type.HASH) .setPrefixes(goods:) // 与 CLI 端 PREFIX 1 goods: 保持一致 .setLanguage(chinese); // 中文分词 String idxName idx:goods; client.ftCreate(idxName, IndexOptions.defaultOptions().setDefinition(rule), schema);注意索引名idx:goods和数据 key 前缀goods:是两件事——前者是索引身份证后者是索引盯的 hash key。别把索引名当 key 前缀用。写入索引写 hash 即同步入索引public boolean addGoodsIndex(Goods goods) { MapString, String hash MyBeanUtil.toMap(goods); hash.put(_language, chinese); // key 必须以索引绑定的前缀「goods:」开头否则不会被索引 client.hset(goods: goods.getGoodsId(), hash); return true; }中文搜索带分页 / 排序public SearchResult search(String idxName, SearchObjVO vo, Page? page) { String queryKey String.format(goodsName:(%s), vo.getKeyword()); Query q new Query(queryKey).setLanguage(chinese); if (StringUtils.isNotBlank(vo.getSidx())) { q.setSortBy(vo.getSidx(), Constants.SORT_ASC.equals(vo.getOrder())); } q.limit((int) page.offset(), (int) page.getSize()); return client.ftSearch(idxName, q); }关键设计写 Redis 的代码就是业务现有的 hash 写入代码——只要规范 key 前缀goods:索引就自动跟着 hash 写入实时更新不用单独维护 ES 同步管道。4 个真实使用边界边界 1开源版没有集群最常见RediSearch开源版只支持单实例——集群版只在 Redis 企业版付费里有。如果你的搜索数据量超过单机内存上限必须考虑 Redis 企业版或回到 ES。这是这个工具最大的边界先确认你的数据规模再决定。边界 2拼音转中文不支持常见ES IK 分词器有「拼音转中文」插件pinyin用户输入xiaomi能搜出「小米」。RediSearch 内置中文分词但没有拼音插件需要自己在应用层做拼音转写。电商搜索这是硬需求要提前评估。边界 3重启后索引要重建少见但破坏力大RediSearch 2.0 起索引本身会跟着 Redis 持久化文件一起 dump但 RDB 加载时仍要做一次「索引重建」——百万级数据大约 3-5 分钟期间搜索服务不可用。修法有两条独立选择走 AOF 持久化 everysec 同步appendonly yes/appendfsync everysec——重启时 replay AOF 比 RDB 重建索引快得多但写入 IO 会高一些维持 RDBsave 60 1000等搜索请求走主从分离——主重启的几分钟由从节点顶上搜索可用性不中断。别把 AOF 和 RDB 混着写——save 60 1000是 RDB 快照配置appendonly yes才是 AOF 开关两者是独立的持久化策略。边界 4和业务 hash 共享 key 空间高级场景HSET goods:1001 ...既是业务数据也是索引源——业务侧误删 key 等于删索引数据。修法用专属前缀idx:goods:1001隔离或加权限控制。最后说一句搜索方案的选择不是「哪个最强」是「哪个最匹配你的规模」。RediSearch 不是来替代 ES 的——它是为「90% 项目其实不需要 ES」这件事提供的更轻方案。好的搜索基础设施不是功能最多的那个是让你不用为搜索单独维护一个集群的那个。仓库github.com/RediSearch/RediSearch欢迎加入我的知识星球全面提升技术能力。 加入方式“长按”或“扫描”下方二维码噢星球的内容包括项目实战、面试招聘、源码解析、学习路线。文章有帮助的话在看转发吧。 谢谢支持哟 (*^__^*