前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸!

比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸!

作者头像
macrozheng
发布于 2022-04-12 07:10:34
发布于 2022-04-12 07:10:34
1.5K00
代码可运行
举报
文章被收录于专栏:mall学习教程mall学习教程
运行总次数:0
代码可运行

Redis是开发中非常常用的内存数据存储中间件,之前基本上用它来做内存存储使用。最近发现Redis推出了很多增强模块,例如通过RedisJSON可以支持原生JSON对象的存储,使用RediSearch可以作为搜索引擎使用,并且支持中文搜索!今天给大家带来RediSearch+RedisJSON作为搜索引擎的使用实践,希望对大家有所帮助!

RedisMod简介

首先介绍下RedisMod这个东西,它是一系列Redis的增强模块。有了RedisMod的支持,Redis的功能将变得非常强大。目前RedisMod中包含了如下增强模块:

  • RediSearch:一个功能齐全的搜索引擎;
  • RedisJSON:对JSON类型的原生支持;
  • RedisTimeSeries:时序数据库支持;
  • RedisGraph:图数据库支持;
  • RedisBloom:概率性数据的原生支持;
  • RedisGears:可编程的数据处理;
  • RedisAI:机器学习的实时模型管理和部署。

安装

首先我们需要安装带所有RedisMod的Redis,使用Docker来安装非常方便的!

  • 使用如下命令下载RedisMod的镜像;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull redislabs/redismod:preview
  • 容器中运行RedisMod服务。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -p 6379:6379 --name redismod \
-v /mydata/redismod/data:/data \
-d redislabs/redismod:preview

RedisJSON

有了RedisJSON模块,Redis就可以存储原生JSON类型数据了,通过它你可以很方便地访问JSON中的各个属性,类似在MongoDB中那样,下面我们就来体验下,这里我们将使用RedisInsight 来操作Redis。

  • 首先通过JSON.SET命令向Redis中添加JSON类型键值对,几个商品对象数据,由于JSON是树形结构的,使用$符号代表往JSON的根节点中添加数据;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JSON.SET product:1 $ '{"id":1,"productSn":"7437788","name":"小米8","subTitle":"全面屏游戏智能手机 6GB+64GB 黑色 全网通4G 双卡双待","brandName":"小米","price":2699,"count":1}'
JSON.SET product:2 $ '{"id":2,"productSn":"7437789","name":"红米5A","subTitle":"全网通版 3GB+32GB 香槟金 移动联通电信4G手机 双卡双待","brandName":"小米","price":649,"count":5}'
JSON.SET product:3 $ '{"id":3,"productSn":"7437799","name":"Apple iPhone 8 Plus","subTitle":"64GB 红色特别版 移动联通电信4G手机","brandName":"苹果","price":5499,"count":10}'
  • 数据插入成功后,在RedisInsight中将看到如下信息,JSON数据支持格式化高亮显示;
  • 接下来可以通过JSON.GET命令获取JSON类型键值对的值;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JSON.GET product:1
  • 也可以只获取值的指定属性,在RedisJSON中,获取JSON对象中的属性时需要以.开头;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JSON.GET product:1 .name .subTitle
  • 还可以通过JSON.TYPE命令来获取JSON对象类型。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JSON.TYPE product:1 .

RediSearch

通过RediSearch模块,Redis可以变成一个功能强大的全文搜索引擎,并且原生支持中文搜索,下面我们就来体验下!

  • 使用RediSearch来搜索数据之前,我们得先创建下索引,建立索引的语法有点复杂,我们先来看下;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.CREATE {index}
  [ON {data_type}]
     [PREFIX {count} {prefix} [{prefix} ..]
     [LANGUAGE {default_lang}]
  SCHEMA {identifier} [AS {attribute}]
      [TEXT | NUMERIC | GEO | TAG ] [CASESENSITIVE]
      [SORTABLE] [NOINDEX]] ...
  • 使用FT.CREATE命令可以建立索引,语法中的参数意义如下;
    • index:索引名称;
    • data_type:建立索引的数据类型,目前支持JSON或者HASH两种;
    • PREFIX:通过它可以选择需要建立索引的数据前缀,比如PREFIX 1 "product:"表示为键中以product:为前缀的数据建立索引;
    • LANGUAGE:指定TEXT类型属性的默认语言,使用chinese可以设置为中文;
    • identifier:指定属性名称;
    • attribute:指定属性别名;
    • TEXT | NUMERIC | GEO | TAG:这些都是属性可选的类型;
    • SORTABLE:指定属性可以进行排序。
  • 看了语法可能不太好理解,直接对之前的商品数据建立索引试试就懂了;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.CREATE productIdx ON JSON PREFIX 1 "product:" LANGUAGE chinese SCHEMA $.id AS id NUMERIC $.name AS name TEXT $.subTitle AS subTitle TEXT $.price AS price NUMERIC SORTABLE $.brandName AS brandName TAG
  • 建立完索引后,我们就可以使用FT.SEARCH对数据进行查看了,比如使用*可以查询全部;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx *
  • 由于我们设置了price字段为SORTABLE,我们可以以price降序返回商品信息;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx * SORTBY price DESC
  • 还可以指定返回的字段;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx * RETURN 3 name subTitle price
  • 我们把brandName设置为了TAG类型,我们可以使用如下语句查询品牌为小米苹果的商品;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx '@brandName:{小米 | 苹果}'
  • 由于priceNUMERIC类型,我们可以使用如下语句查询价格在500~1000的商品;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx '@price:[500 1000]'
  • 还可以通过前缀进行模糊查询,类似于SQL中的LIKE,使用*表示;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx '@name:小米*'
  • FT.SEARCH中直接指定搜索关键词,可以对所有TEXT类型的属性进行全局搜索,支持中文搜索,比如我们搜索下包含黑色字段的商品;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx '黑色'
  • 当然我们也可以指定搜索的字段,比如搜索副标题中带有红色字段的商品;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx '@subTitle:红色'
  • 通过FT.DROPINDEX命令可以删除索引,如果加入DD选项的话,会连数据一起删除;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.DROPINDEX productIdx
  • 通过FT.INFO命令可以查看索引状态;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.INFO productIdx
  • RediSearch的搜索语法比较复杂,不过我们可以对比SQL来使用它,具体可以参考下表。

对比Elasticsearch

Redis官方曾公布了RediSearch与Elasticsearch的性能对比测试,大家可以看下。

索引能力

对Wikipedia的560万(5.3GB)文档进行索引,RediSearch耗时221s,Elasticsearch耗时349s,RediSearch快了58%

查询能力

数据建立索引后,使用32个客户端对两个单词进行检索,RediSearch的吞吐量达到12.5K ops/sec,Elasticsearch的吞吐量为3.1K ops/sec,RediSearch比Elasticsearch要快4倍。同时RediSearch的延迟为8ms,而Elasticsearch为10ms,RediSearch延迟稍微低些!

总结

经过这么多年的发展,Redis的功能也越来越强大了,它已经不仅仅是个缓存工具了,更像是一个数据库了。RediSearch给了我们实现搜索功能的另一个选择,性能也非常不错,大家如果做搜索相关功能的话可以考虑下它!

参考资料

  • 官方文档:https://developer.redis.com/howtos/redisjson/
  • 参考手册:https://oss.redis.com/redisearch/
  • 性能测试:https://redis.com/blog/search-benchmarking-redisearch-vs-elasticsearch/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 macrozheng 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
<!DOCTYPE html PUBLIC……>的组成解释「建议收藏」
DOCTYPE是document type(文档类型)的简写,在web设计中用来说明你用的XHTML或者HTML是什么版本。
全栈程序员站长
2022/09/14
8930
对WEB标准的理解
“div+CSS”可以说是WEB标准在中国的一个里程碑式的标志,连原先只懂table的程序员也知道WEB标准不是简单的把table换成div,甚至开始会关注WEB标准的一些东西,比如对SEO的效果。
GhostZhang
2022/08/21
3500
Web标准
web标准不是某一个标准,而是由W3C和其他标准化组织制定的一系列标准的集合。主要包括结构(Structure)、表现(Presentation)和行为(Behavior)三个方面。
星辰_大海
2020/09/30
6260
Web标准中的常见问题
大概在2004年的时候,Web标准的概念藉由一本名为《网站重构》的书开始被国内人所了解。随后的几年中,其更少的代码量、更好的搜索引擎友好性、更好的浏览器兼容性使得Web标准迅速受到重视并逐渐普及,网易、新浪等各大网站相继采用Web标准进行网站重构。
张子阳
2018/09/27
1.2K0
前端面试三 新的一周
本文介绍了前端面试中常见的问题和答案,包括HTML、CSS、JavaScript、DOM、BOM、浏览器、CSS盒模型、CSS选择器、继承、优先级、响应式设计、浏览器兼容性问题等。同时,也介绍了解决常见IE6 BUG的方法和其他一些CSS技巧。
企鹅号小编
2017/12/27
1.2K0
前端面试三 新的一周
HTML+CSS 面试题整理(一)
1.web标准: (1)结构标准:其语言主要包括XHTML(实现HTML向XML的过渡。)和XML(用于弥补HTML的不足) (2)表现标准:其语言主要包括CSS(帮助设计师分离外观与结构) (3)行为标准:其语言主要包括W3C Dom(提供标准方法用于访问站点中的数据、脚本和表现层对象)和ECMAScript (4)代码标准: ①必须结束标记:XHTML必须,HTML不一定 ②小写元素和属性名:XHTML对大小写敏感,HTML不敏感 ③比较必须合理嵌套 ④属性必须用“”括起来:XHTML必须,HTML
用户1667431
2018/04/18
1.1K0
HTML+CSS 面试题整理(一)
【Web前端技术】第一节—HTML简介
网站 是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示特定内容相关的网页集合。
云边有个稻草人
2025/04/17
1540
【Web前端技术】第一节—HTML简介
网页w3c标准_让行为成为标准
什么是W3C标准 作为网站技术开发人员而言,往往是站在自己的开发角度来实施网站布署(读取数据及开发的方便性等等),而不是站在网站访问者与搜索引擎角度。因此大部分的网站在浏览方面不够直观或是方便,特别是现在w3c的规范,更是在大部分的网站开发人员脑里一片空白。何况百度 、google、msn、yahoo等专业搜索引擎更有自己的搜索规则及判断网页等级技术,所以网站要优化,优化的目的只有一个:符合标准,符合蜘 蛛爬行的标准,更重要的是符合网站访问者浏览的方便及易用性。 要知道W3C标准,有必要先弄清楚什么是W3C?
全栈程序员站长
2022/09/29
4370
CSS详解(1.什么是css)
W3C自1996年12月发布第一个CSS正式推荐版CSS 1.0以来,一直在对CSS标准进行修订、升级。1999年1月,CSS 2.0 正式推荐版发布,增加了对其它媒体(打印机、视觉设备)、可下载字体、元素定位和表格的支持。最新版本的CSS标准CSS 3.0已经发部,就是HTML5里面的主要东西。
ruochen
2021/11/20
4210
W3C规范_web标准和w3c标准
网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。
全栈程序员站长
2022/09/30
9220
什么是web标准以及web标准的构成_web标准的理解
不是某一个标准,而是一系列标准的集合。网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。对应的标准也分三方面:结构化标准语言主要包括XHTML和XML,表现标准语言主要包括CSS,行为标准主要包括对象模型(如W3C DOM)、ECMAScript等。这些标准大部分由万维网联盟(外语缩写:W3C)起草和发布,也有一些是其他标准组织制订的标准,比如ECMA(European Computer Manufacturers Association)的ECMAScript标准。
全栈程序员站长
2022/09/20
2K0
熟悉w3c标准_w3c规则
    万维网联盟(外语缩写:W3C)标准不是某一个标准,而是一系列标准的集合。网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。对应的标准也分三方面:结构化标准语言主要包括 XHTML 和 XML,表现标准语言主要包括 CSS,行为标准主要包括对象模型(如 W3C DOM)、ECMAScript 等。这些标准大部分由万维网联盟(外语缩写:W3C)起草和发布,也有一些是其他标准组织制订的标准,比如 ECMA(European Computer Manufacturers Association)的 ECMAScript 标准。
全栈程序员站长
2022/09/30
7490
【前端每日一题 01】Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?
回答一 声明位于文档中的最前面,处于标签之前。告知浏览器的解析器,用什么文档类型 规范来解析这个文档。 严格模式的排版和JS 运作模式是以该浏览器支持的最高标准运行。 在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。 DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。 回答二 doctype声明指出阅读程序应该用什么规则集来解释文档中的标记。在Web文档的情况下,“阅读程序”通常是浏览器或者校验器这样的一个程序,“规则”则是W3C所发布的一个文档类型定义(
桃翁
2018/06/27
1K0
W3C标准是_关于w3c标准下列说法错误的是
为了让任何人在任何时间、任何地点、通过任何设备访问web内容。作为用户和浏览器制造商之间的中间层,要想办法满足下游的用户和上游不同浏览器看到的是同样的内容,让页面、程序能支持所有的浏览器,能够满足尽可能多的用户
全栈程序员站长
2022/09/30
5680
web前端开发学习如何规划
在这个新的互联网行业大时代里,很多年轻人以及学生都会去选择IT互联网这个行业,要想成功融入到web前端这个岗位之中去,首先你肯定要先熟悉前端到底是做什么的,它有哪些课程,他都能做些什么?我们该如何学习如何规划自己?
千锋哈尔滨IT培训
2019/11/27
6450
web前端开发学习如何规划
HTML入门零基础教程(一)
网站是指在因特网上根据一定的规则,使用HTML等制作的用于展示特定内容相关的网页集合。
异星球的小怪同志
2022/11/20
4590
HTML入门零基础教程(一)
从零开始学 Web 之 HTML(一)认识前端
前端对于网站来说,通常是指网页,网站的前台部分包括网站的表现层和结构层。因此前端技术一般分为前端设计和前端开发。
Daotin
2018/08/31
6050
从零开始学 Web 之 HTML(一)认识前端
Web标准与前端开发
前端最早诞生于1989年,最早的Web是由HTML、HTTP、URL三种技术构成,而我们现在的CSS和JavaScript都是后来才出现的技术。前端发展至今可以分为三个时代分别是只读时代、体验时代、敏捷时代。
zayyo
2023/12/05
3571
HTML基础01-HTML简介
网站是指在因特网上根据一定的规则,使用HTML等制作的用于展示特定内容相关的网页集合;网页是网站中的一“页”,通常是HTML格式的文件,它要通过浏览器来阅读;网页是构成网站的基本元素,它通常由图片、连接、文字、声音、视频等元素组成;我们看到的网页,常见以.htm或.html后缀结尾,故称为HTML文件。
yangjiao
2021/03/04
5810
常见的前端面试题,总有一点让你涨知识
首先在面试时,我会大声说:"本人擅长Ai、Fw、Fl、Br、Ae、Pr、Id、Ps等软件的安装与卸载,精通CSS、PHP、ASP、C、C++、C#、Java、Ruby、Perl、Lisp、python、Objective-C、ActionScript、Pascal等单词的拼写, 熟悉Windows、Linux、Mac、Android、IOS、WP8等系统的开关机". 然后..... ...................对了,没有然后了...................... 1.对WEB标准以及W3C
企鹅号小编
2018/02/11
1.1K0
常见的前端面试题,总有一点让你涨知识
相关推荐
<!DOCTYPE html PUBLIC……>的组成解释「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验