·设为首页收藏本站📧邮箱修改🎁免费下载专区💎积分✅卡密📒收藏夹👽聊天室
DZ插件网 门户 网站安全 查看内容

超越 ES!RediSearch + RedisJSON = 王炸!

2024-9-5 16:39| 发布者: TyCoding| 查看: 90925| 评论: 0

摘要: mall学习教程官网:macrozheng.comRedis是开发中非常常用的内存数据存储中间件,之前基本上用它来做内存存储使用。最近发现Redis推出了很多增强模块,例如通过RedisJSON可以支持原生JSON对象的存储,使用RediSearch ...

超越 ES!RediSearch + RedisJSON = 王炸!538 作者: 来源: 发布时间:2024-9-5 16:39

mall学习教程官网:macrozheng.com

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的镜像;
docker pull redislabs/redismod:preview
  • 在容器中运行RedisMod服务。
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的根节点中添加数据;
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}'

这或许是一个对你有用的开源项目,mall项目是一套基于 SpringBoot + Vue + uni-app 实现的电商系统(Github标星60K),采用Docker容器化部署,后端支持多模块和微服务架构。包括前台商城项目和后台管理系统,能支持完整的订单流程!涵盖商品、订单、购物车、权限、优惠券、会员、支付等功能!
  • Boot项目:https://github.com/macrozheng/mall
  • Cloud项目:https://github.com/macrozheng/mall-swarm
  • 视频教程:https://www.macrozheng.com/video/

项目演示:
超越 ES!RediSearch + RedisJSON = 王炸!1516 作者: 来源: 发布时间:2024-9-5 16:39

  • 数据插入成功后,在RedisInsight中将看到如下信息,JSON数据支持格式化高亮显示;

超越 ES!RediSearch + RedisJSON = 王炸!7638 作者: 来源: 发布时间:2024-9-5 16:39
  • 接下来可以通过JSON.GET命令获取JSON类型键值对的值;
JSON.GET product:1

超越 ES!RediSearch + RedisJSON = 王炸!5699 作者: 来源: 发布时间:2024-9-5 16:39
  • 也可以只获取值的指定属性,在RedisJSON中,获取JSON对象中的属性时需要以.开头;
JSON.GET product:1 .name .subTitle

超越 ES!RediSearch + RedisJSON = 王炸!6903 作者: 来源: 发布时间:2024-9-5 16:39
  • 还可以通过JSON.TYPE命令来获取JSON对象类型。
JSON.TYPE product:1 .

超越 ES!RediSearch + RedisJSON = 王炸!157 作者: 来源: 发布时间:2024-9-5 16:39

RediSearch


通过RediSearch模块,Redis可以变成一个功能强大的全文搜索引擎,并且原生支持中文搜索,下面我们就来体验下!
  • 使用RediSearch来搜索数据之前,我们得先创建下索引,建立索引的语法有点复杂,我们先来看下;
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:指定属性可以进行排序。

  • 看了语法可能不太好理解,直接对之前的商品数据建立索引试试就懂了;
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对数据进行查看了,比如使用*可以查询全部;
FT.SEARCH productIdx *

超越 ES!RediSearch + RedisJSON = 王炸!7113 作者: 来源: 发布时间:2024-9-5 16:39
  • 由于我们设置了price字段为SORTABLE,我们可以以price降序返回商品信息;
FT.SEARCH productIdx * SORTBY price DESC

超越 ES!RediSearch + RedisJSON = 王炸!3500 作者: 来源: 发布时间:2024-9-5 16:39
  • 还可以指定返回的字段;
FT.SEARCH productIdx * RETURN 3 name subTitle price

超越 ES!RediSearch + RedisJSON = 王炸!4576 作者: 来源: 发布时间:2024-9-5 16:39
  • 我们把brandName设置为了TAG类型,我们可以使用如下语句查询品牌为小米苹果的商品;
FT.SEARCH productIdx '@brandName:{小米 | 苹果}'

超越 ES!RediSearch + RedisJSON = 王炸!5070 作者: 来源: 发布时间:2024-9-5 16:39
  • 由于priceNUMERIC类型,我们可以使用如下语句查询价格在500~1000的商品;
FT.SEARCH productIdx '@price:[500 1000]'

超越 ES!RediSearch + RedisJSON = 王炸!3252 作者: 来源: 发布时间:2024-9-5 16:39
  • 还可以通过前缀进行模糊查询,类似于SQL中的LIKE,使用*表示;
FT.SEARCH productIdx '@name:小米*'

超越 ES!RediSearch + RedisJSON = 王炸!8263 作者: 来源: 发布时间:2024-9-5 16:39
  • FT.SEARCH中直接指定搜索关键词,可以对所有TEXT类型的属性进行全局搜索,支持中文搜索,比如我们搜索下包含黑色字段的商品;
FT.SEARCH productIdx '黑色'

超越 ES!RediSearch + RedisJSON = 王炸!4784 作者: 来源: 发布时间:2024-9-5 16:39
  • 当然我们也可以指定搜索的字段,比如搜索副标题中带有红色字段的商品;
FT.SEARCH productIdx '@subTitle:红色'

超越 ES!RediSearch + RedisJSON = 王炸!5473 作者: 来源: 发布时间:2024-9-5 16:39
  • 通过FT.DROPINDEX命令可以删除索引,如果加入DD选项的话,会连数据一起删除;
FT.DROPINDEX productIdx
  • 通过FT.INFO命令可以查看索引状态;
FT.INFO productIdx

超越 ES!RediSearch + RedisJSON = 王炸!3095 作者: 来源: 发布时间:2024-9-5 16:39
  • RediSearch的搜索语法比较复杂,不过我们可以对比SQL来使用它,具体可以参考下表。

超越 ES!RediSearch + RedisJSON = 王炸!9945 作者: 来源: 发布时间:2024-9-5 16:39

对比Elasticsearch


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

索引能力


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

超越 ES!RediSearch + RedisJSON = 王炸!3294 作者: 来源: 发布时间:2024-9-5 16:39

查询能力


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

超越 ES!RediSearch + RedisJSON = 王炸!2095 作者: 来源: 发布时间:2024-9-5 16:39

总结


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

参考资料

  • 官方文档:https://redis.io/docs/interact/search-and-query/
  • 性能测试:https://redis.com/blog/search-benchmarking-redisearch-vs-elasticsearch/


Github上标星60K的电商实战项目mall,全套 视频教程(2023最新版) 已更新完毕!全套教程约40小时,共113期,通过这套教程你可以拥有一个涵盖主流Java技术栈的完整项目经验,同时提高自己独立开发一个项目的能力,下面是项目的整体架构图,感兴趣的小伙伴可以点击链接 mall视频教程 加入学习。

超越 ES!RediSearch + RedisJSON = 王炸!815 作者: 来源: 发布时间:2024-9-5 16:39

整套 视频教程 的内容还是非常完善的,涵盖了mall项目最佳学习路线、整体框架搭建、业务与技术实现全方位解析、线上Docker环境部署、微服务项目学习等内容,具体大纲可以参考下图,你也可以点击链接 mall视频教程 了解更多内容。

超越 ES!RediSearch + RedisJSON = 王炸!7869 作者: 来源: 发布时间:2024-9-5 16:39

推荐阅读

  • 69K Star!这是我见过最强的开源电商系统 !!
  • Github标星60K!一套完整的项目实战教程来了,主流Java技术一网打尽!
  • 看了我项目中购物车、订单、支付一整套设计,同事也开始悄悄模仿了...
  • 订单系统就该这么设计,稳的一批!
  • 支付系统就该这么设计,稳的一批!
  • 权限系统就该这么设计,稳的一批!







上一篇:晚上总是加班,白天上班迟到,可以吗?
下一篇:用了这款 IDEA 神器,领导都夸我代码写得好!

鲜花

握手

雷人

路过

鸡蛋

评论

您需要登录后才可以发表言论 登录立即注册
创宇盾启航版免费网站防御网站加速服务
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.148.108.201,GMT+8, 2024-11-25 15:10 , Processed in 0.175675 second(s), 43 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2024 Discuz! Team.

关灯
扫一扫添加微信客服
QQ客服返回顶部
返回顶部