Redis7系列:百万数据级Redis Search 吊打 ElasticSearch

1、Redis Search深度解析

1.1 核心特性

Redis Search是基于Redis的全文搜索引擎模块(RediSearch),具备以下核心能力:

  • 实时索引写入与查询(微秒级延迟)
  • 支持文本、数值、地理空间等多类型数据
  • 内置中文分词支持(需加载Friso分词器)
  • 丰富的聚合分析功能
  • 与Redis数据结构无缝集成

1.2 颠覆认知

Redis Search 的「核弹级」实战手册

你以为 Redis 只能做缓存?这5个黑科技直接封神!

  • 0.1ms 极限响应:实测百万级数据查询比 MySQL 快 1000 倍
  • 中文分词暴击:电商搜索"苹果手机",竟自动识别「新品/二手/5G」标签(附分词配置秘籍)
  • 内存杀招:1亿数据仅占 12GB 内存,某大厂用它替代 ES 节省 80% 服务器成本
  • 骚操作预警:用 GEO 索引实现「附近的人」功能,代码量减少 90%
  • 隐藏大招:结合 RedisJSON 玩转嵌套文档搜索(附避坑指南)

1.3 手撕代码现场

程序员最爱的「暴力」命令行

数据准备

json 复制代码
{
    "name": "张三",
    "age": 15,
    "job": "java",
    "city": "上海市"
},
{
    "name": "李四",
    "age": 20,
    "job": "c",
    "city": "杭州市"
},
{
    "name": "王五",
    "age": 30,
    "job": "python,java",
    "city": "杭州市"
}

创建索引的命令

bash 复制代码
#命令
FT.CREATE index 
  [ON HASH | JSON] 
  [PREFIX count prefix [prefix ...]] 
  [FILTER {filter}]
  [LANGUAGE default_lang] 
  [LANGUAGE_FIELD lang_attribute] 
  [SCORE default_score] 
  [SCORE_FIELD score_attribute] 
  [PAYLOAD_FIELD payload_attribute] 
  [MAXTEXTFIELDS] 
  [TEMPORARY seconds] 
  [NOOFFSETS] 
  [NOHL] 
  [NOFIELDS] 
  [NOFREQS] 
  [STOPWORDS count [stopword ...]] 
  [SKIPINITIALSCAN]
  SCHEMA field_name [AS alias] TEXT | TAG | NUMERIC | GEO | VECTOR | GEOSHAPE [ SORTABLE [UNF]] 
  [NOINDEX] [ field_name [AS alias] TEXT | TAG | NUMERIC | GEO | VECTOR | GEOSHAPE [ SORTABLE [UNF]] [NOINDEX] ...]

主要参数说明

  • index :索引的名称
  • [ON HASH | JSON] :支持的数据类型Hash、JSON
  • [PREFIX count prefix [prefix ...]] :指定Key值前缀的个数,并罗列前缀。罗列的前缀个数要和前面的数据匹配。
  • SCHEMA:关键字,后面接要创建索引的字段
  • TEXT | TAG | NUMERIC | GEO | VECTOR :字段的类型
    • TEXT :字符串类型
    • TAG:标签,可理解为字典类型
    • NUMERIC :数字类型
    • GEO :地理位置
    • VECTOR:向量

创建索引

针对key值以search_data 开头的所有数据,创建hash:search:index索引。

bash 复制代码
# 可执行命令
FT.CREATE hash:search:index ON HASH PREFIX 1 'search_data' SCHEMA name TEXT WEIGHT 10.0 age NUMERIC SORTABLE job TAG city TEXT


# 参数说明
FT.CREATE 
	# 索引名称
    hash:search:index 
    # 索引的数据类型:支持hash |json
	ON HASH 
	# 针对创建索引Redis中key的前缀数量以及罗列
	PREFIX 1 'search_data' 
	# 关键词:后面接创建索引的字段
	SCHEMA 
		# 指定数据类型为text, 权重为10.默认是1
		name TEXT WEIGHT 10.0 
		# 指定数据类型为numeric,可以排序
		age NUMERIC SORTABLE 
		# 指定数据类型为tag
		job type TAG 
		# 指定数据类型为Text
		city TEXT

查询

查看所有数据,并按照年龄倒序排列

shell 复制代码
> FT.SEARCH hash:search:index * sortby age desc
1) "3"
2) "search_data_03"
3) 1) "age"
   2) "30"
   3) "name"
   4) "\xe7\x8e\x8b\xe4\xba\x94"
   5) "job"
   6) "python,java"
   7) "city"
   8) "\xe6\x9d\xad\xe5\xb7\x9e\xe5\xb8\x82"
4) "search_data_02"
5) 1) "age"
   2) "20"
   3) "name"
   4) "\xe6\x9d\x8e\xe5\x9b\x9b"
   5) "job"
   6) "c"
   7) "city"
   8) "\xe8\x8b\x8f\xe5\xb7\x9e\xe5\xb8\x82"
6) "search_data"
7) 1) "age"
   2) "15"
   3) "name"
   4) "\xe5\xbc\xa0\xe4\xb8\x89"
   5) "job"
   6) "java"
   7) "city"
   8) "\xe4\xb8\x8a\xe6\xb5\xb7\xe5\xb8\x82"

查看【name=李四】的数据

shell 复制代码
> FT.SEARCH hash:search:index "@name:李四"
1) "1"
2) "search_data_02"
3) 1) "name"
   2) "\xe6\x9d\x8e\xe5\x9b\x9b"
   3) "age"
   4) "20"
   5) "job"
   6) "c"
   7) "city"
   8) "\xe8\x8b\x8f\xe5\xb7\x9e\xe5\xb8\x82"

查看年龄20岁及以上,job为java的数据

shell 复制代码
> FT.SEARCH hash:search:index "@age:[20 +inf] @job:{java}"
1) "1"
2) "search_data_03"
3) 1) "name"
   2) "\xe7\x8e\x8b\xe4\xba\x94"
   3) "age"
   4) "30"
   5) "job"
   6) "python,java"
   7) "city"
   8) "\xe6\x9d\xad\xe5\xb7\x9e\xe5\xb8\x82"

基于JSON数据的注意事项

上述案例采用了Hash的数据结构,JSON数据结构要求会严格一点,必须为{"key": value}的格式,否则获取的时候会有困难或者无法获取

1.4 血赚案例

这些公司靠 Redis Search 省了一套房

场景 某音玩法 结果
直播弹幕实时检索 关键词屏蔽+用户画像过滤 审核效率提升 300%
证券行情闪电查询 千档盘口+分时图混合查询 行情延迟从 50ms 降至 0.5ms
物联网设备预警 10万+/秒传感器数据实时分析 服务器成本减少 60%

2、ElasticSearch 的「死亡痛点」大曝光

ElasticSearch 在倒排索引领域已经取得优异的成绩,更适合PB级的数据。但是尺有所短、寸有所长,并不是所有场景都可以使用其解决问题。

2.1 核心优势

  • 分布式架构:原生支持PB级数据水平扩展
  • 分词能力:内置ICU、IK等专业分词器,支持同义词、拼音等高级功能
  • 数据持久化:基于Lucene的段存储机制保障数据可靠性
  • 生态体系:完善的ELK技术栈(Kibana/Logstash/Beats)
  • 大数据之神:PB级数据分布式处理无压力

2.2 局限性

  • 资源消耗:内存需求高(建议配置堆内存30GB+)
  • 运维复杂度:需要专业集群管理(分片分配、版本升级等)
  • 实时性:默认近实时(1秒延迟)
  • 学习成本:DSL查询语法较复杂

2.3 痛点场景

❌ 这些场景用 ES 就是找死!

  • 高频更新场景:某游戏排行榜每分钟更新 10 万次,ES 集群直接崩盘
  • 极致延迟要求:金融订单系统要求 <1ms 响应,ES 跪地求饶
  • 小型数据集合:10GB 数据硬上 ES,维护成本比开发成本还高

2.4 血泪教训

💣 ES 七宗罪(附血泪教训)

  1. 内存吸血鬼:32GB 机器实际可用不到 10GB(JVM 堆内存魔咒)
  2. 分片地狱:某公司误设 1000 分片,查询直接超时 30 秒
  3. 版本升级坑:从 7.x 升 8.x 踩坑 20+ 小时(兼容性列表比代码还长)
  4. 冷启动暴击:10 亿数据初始化索引要 8 小时(Redis Search 只要 40 分钟)
  5. 昂贵的专家:招一个 ES 工程师的钱够买 3 台服务器

3、Redis Search优势

  • 极致速度:内存计算带来碾压级性能,微秒级响应
  • 吞吐量:百万级写入12万/秒(单线程)左右
  • 实时王者:写入即查无延迟,适合金融/社交等场景
  • 成本杀手:节省50%+服务器资源
  • 高频更新:基于内存高频更新,CPU的占用率更低
  • 资源消耗低:轻量级,1亿数据仅需数GB内存,单节点可运行
对比维度 Redis Search ElasticSearch
实时性 微秒级延迟:数据写入即可查询,无需刷新间隔 近实时(约1秒延迟):依赖索引刷新机制
内存性能 🚀 全内存存储:读写速度极快,适合高频实时场景 📁 磁盘+内存缓存:依赖文件系统缓存,速度较慢
资源消耗 💡 轻量级:1亿数据仅需数GB内存,单节点可运行 💸 高资源需求:需要大内存+SSD,集群运维成本高
架构复杂度 🛠️ 零依赖:无需额外组件,与Redis生态无缝集成 🔗 依赖集群:需部署多个节点+分片管理,复杂度高
混合查询能力 🔍 原生支持:文本+数值+地理空间查询一站式解决 🧩 需组合方案:复杂查询需结合其他工具(如Kibana)

5、选型建议

评估维度 Redis Search ElasticSearch
延迟要求 <1ms 10-100ms
数据规模 <1TB >1TB
查询复杂度 中等(支持聚合但不支持嵌套查询) 高(支持管道聚合、脚本查询等)
运维成本 低(单节点) 高(需集群管理)
实时性要求 极高(金融交易、游戏场景) 高(日志分析、监控系统)

实施建议

  • 实时优先场景:选Redis Search(如在线客服系统)
  • 大数据分析:选ElasticSearch(如日志分析平台)
  • 混合架构:用Redis Search作缓存层,ElasticSearch作持久层
  • 轻量级应用:Redis Search单机版可降低运维复杂度

6、未来预言

Redis Search 3.0 王炸功能

  • 支持向量搜索(AI场景)
  • 增强的JSON路径查询
  • 分布式集群方案改进

ElasticSearch 的绝地反击

  • 增强自然语言处理能力
  • 优化稀疏数据存储效率
  • 强化安全管控体系
相关推荐
LanLance13 分钟前
ES101系列09 | 运维、监控与性能优化
java·运维·后端·elasticsearch·云原生·性能优化·golang
Piper蛋窝18 分钟前
我所理解的 Go 的 `panic` / `defer` / `recover` 异常处理机制
后端·go
clk66071 小时前
Spring Boot
java·spring boot·后端
皮皮高2 小时前
itvbox绿豆影视tvbox手机版影视APP源码分享搭建教程
android·前端·后端·开源·tv
弱冠少年2 小时前
golang入门
开发语言·后端·golang
Humbunklung2 小时前
Rust 函数
开发语言·后端·rust
喜欢踢足球的老罗2 小时前
在Spring Boot 3.3中使用Druid数据源及其监控功能
java·spring boot·后端·druid
jakeswang2 小时前
StarRocks
后端·架构
龙云飞谷2 小时前
从原理到调参,小白也能读懂的大模型微调算法Lora
后端
荣江2 小时前
【实战】基于 Tauri 和 Rust 实现基于无头浏览器的高可用网页抓取
后端·rust