赞
踩
Redis是开发中非常常用的内存数据存储中间件,之前基本上用它来做内存存储使用。最近发现Redis推出了很多增强模块,例如通过RedisJSON可以支持原生JSON对象的存储,使用RediSearch可以作为搜索引擎使用,并且支持中文搜索!今天给大家带来RediSearch+RedisJSON作为搜索引擎的使用实践,希望对大家有所帮助!
SpringBoot实战电商项目mall(50k+star)地址:https://github.com/macrozheng/mall
首先介绍下RedisMod这个东西,它是一系列Redis的增强模块。有了RedisMod的支持,Redis的功能将变得非常强大。目前RedisMod中包含了如下增强模块:
首先我们需要安装带所有RedisMod的Redis,使用Docker来安装非常方便的!
docker pull redislabs/redismod:preview
docker run -p 6379:6379 --name redismod \
-v /mydata/redismod/data:/data \
-d redislabs/redismod:preview
有了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}'
JSON.GET
命令获取JSON类型键值对的值;JSON.GET product:1
.
开头;JSON.GET product:1 .name .subTitle
JSON.TYPE
命令来获取JSON对象类型。JSON.TYPE product:1 .
通过RediSearch模块,Redis可以变成一个功能强大的全文搜索引擎,并且原生支持中文搜索,下面我们就来体验下!
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
命令可以建立索引,语法中的参数意义如下;
PREFIX 1 "product:"
表示为键中以product:
为前缀的数据建立索引;看了语法可能不太好理解,直接对之前的商品数据建立索引试试就懂了;
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:{小米 | 苹果}'
price
是NUMERIC
类型,我们可以使用如下语句查询价格在500~1000
的商品;FT.SEARCH productIdx '@price:[500 1000]'
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
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给了我们实现搜索功能的另一个选择,性能也非常不错,大家如果做搜索相关功能的话可以考虑下它!
如果你想了解更多Redis实战技巧的话,可以试试这个带全套教程的实战项目(50K+Star):https://github.com/macrozheng/mall
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。