RediSearch加RedisJSON大于Elasticsearch的搜索存储引擎

 更新时间:2022年07月07日 16:28:22   作者:macrozheng  
这篇文章主要为大家介绍了RediSearch加RedisJSON大于Elasticsearch的王炸使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

RedisMod简介

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

SpringBoot实战电商项目mall(50k+star)地址:https://github.com/macrozheng/mall

首先介绍下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}'

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

接下来可以通过JSON.GET命令获取JSON类型键值对的值;

JSON.GET product:1

也可以只获取值的指定属性,在RedisJSON中,获取JSON对象中的属性时需要以.开头;

JSON.GET product:1 .name .subTitle

还可以通过JSON.TYPE命令来获取JSON对象类型。

JSON.TYPE product:1 .

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 *

由于我们设置了price字段为SORTABLE,我们可以以price降序返回商品信息;

FT.SEARCH productIdx * SORTBY price DESC

还可以指定返回的字段;

FT.SEARCH productIdx * RETURN 3 name subTitle price

我们把brandName设置为了TAG类型,我们可以使用如下语句查询品牌为小米苹果的商品;

FT.SEARCH productIdx '@brandName:{小米 | 苹果}'

由于priceNUMERIC类型,我们可以使用如下语句查询价格在500~1000的商品;

FT.SEARCH productIdx '@price:[500 1000]'

还可以通过前缀进行模糊查询,类似于SQL中的LIKE,使用*表示;

FT.SEARCH productIdx '@name:小米*'

FT.SEARCH中直接指定搜索关键词,可以对所有TEXT类型的属性进行全局搜索,支持中文搜索,比如我们搜索下包含黑色字段的商品;

FT.SEARCH productIdx '黑色'

当然我们也可以指定搜索的字段,比如搜索副标题中带有红色字段的商品;

FT.SEARCH productIdx '@subTitle:红色'

通过FT.DROPINDEX命令可以删除索引,如果加入DD选项的话,会连数据一起删除;

FT.DROPINDEX productIdx

通过FT.INFO命令可以查看索引状态;

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://redis.io/docs/stack/search/

性能测试:https://redis.com/blog/search-benchmarking-redisearch-vs-elasticsearch/

以上就是RediSearch加RedisJSON大于Elasticsearch的王炸的详细内容,更多关于RediSearch RedisJSON的资料请关注脚本之家其它相关文章!

相关文章

  • Redis List列表的详细介绍

    Redis List列表的详细介绍

    这篇文章主要介绍了Redis List列表的详细介绍的相关资料,Redis列表是简单的字符串列表,按照插入顺序排序,需要的朋友可以参考下
    2017-08-08
  • Redis BigKey的问题解决

    Redis BigKey的问题解决

    本文主要介绍了Redis BigKey的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Redis中的bitmap详解

    Redis中的bitmap详解

    BitMap是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间,下面通过本文给大家介绍Redis中的bitmap知识,感兴趣的朋友一起看看吧
    2021-10-10
  • 详解Redis的慢查询日志

    详解Redis的慢查询日志

    这篇文章主要介绍了Redis的慢查询日志的相关资料,帮助大家更好的理解和学习Redis数据库,感兴趣的朋友可以了解下
    2020-08-08
  • 利用Redis lua实现高效读写锁的代码实例

    利用Redis lua实现高效读写锁的代码实例

    这篇文章给大家介绍了如何利用Redis lua实现高效的读写锁,读写锁的好处就是能帮助客户读到的数据一定是最新的,写锁是排他锁,而读锁是一个共享锁,需要的朋友可以参考下
    2024-01-01
  • Redis为什么快如何实现高可用及持久化

    Redis为什么快如何实现高可用及持久化

    这篇文章主要介绍了Redis为什么快如何实现高可用及持久化,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 详解Redis 分布式锁遇到的序列化问题

    详解Redis 分布式锁遇到的序列化问题

    这篇文章主要介绍了Redis 分布式锁遇到的序列化问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Python的Flask框架使用Redis做数据缓存的配置方法

    Python的Flask框架使用Redis做数据缓存的配置方法

    Redis数据库依赖于主存,在关系型数据库以外再配套Redis管理缓存数据将对性能会有很大的提升,这里我们就来看一下Python的Flask框架使用Redis做数据缓存的配置方法
    2016-06-06
  • Redis中过期键删除的三种方法

    Redis中过期键删除的三种方法

    Redis中可以设置键的过期时间,并且通过取出过期字典(expires dict)中键的过期时间和当前时间比较来判断是否过期,那么一个过期的键是怎么被删除的呢?本文给大家总结了三种方法,选了其中两种给大家详细的介绍一下,需要的朋友可以参考下
    2024-05-05
  • 深入解析Java中Redis的20个常用方法

    深入解析Java中Redis的20个常用方法

    随着互联网技术的不断发展,Java编程语言在计算机科学与技术中的应用日益广泛,本论文以"深入解析Java中Redis的20个常用方法"为主题,系统地探讨了Java在Redis数据库操作中的应用和实现,需要的朋友可以参考下
    2024-01-01

最新评论