Redis是开发中非常常用的内存数据存储中间件。之前基本都是用来做内存存储的。最近发现Redis推出了很多增强模块,比如RedisJSON可以支持原生JSON对象的存储,RediSearch可以作为搜索引擎,而且支持中文搜索!今天给大家带来RediSearch+RedisJSON做搜索引擎的实践。希望对您有所帮助!SpringBoot实战电商项目商城(50k+star)地址:https://github.com/macrozheng/mallRedisMod简介首先介绍一下RedisMod,它是一系列Redis增强模块。有了RedisMod的支持,Redis的功能将会变得非常强大。目前RedisMod包括以下增强模块:RediSearch:一个全功能的搜索引擎;RedisJSON:原生支持JSON类型;RedisTimeSeries:时序数据库支持;RedisGraph:图形数据库支持;RedisBloom:原生支持概率数据;RedisGears:可编程数据处理;RedisAI:用于机器学习的实时模型管理和部署。安装首先我们需要安装Redis和所有的RedisMods,使用Docker安装非常方便!使用以下命令下载RedisMod的镜像;dockerpullredislabs/redismod:preview在容器中运行RedisMod服务。dockerrun-p6379:6379--nameredismod\-v/mydata/redismod/data:/data\-dredislabs/redismod:previewRedisJSON有了RedisJSON模块,Redis可以存储原生的JSON类型的数据,通过它可以访问JSON中的各个属性非常方便,类似于MongoDB中的,下面我们来体验一下,这里我们将使用[RedisInsight]()来操作Redis。首先,通过JSON.SET命令将JSON类型的键值对和若干商品对象数据添加到Redis中。由于JSON是树状结构,所以用$符号表示向JSON的根节点添加数据;JSON.SETproduct:1$'{"id":1,"productSn":"7437788","name":"小米8","subTitle":"全面屏电竞手机6GB+64GB黑色全网通4G双卡双待","brandName":"Xiaomi","price":2699,"count":1}'JSON.SETproduct:2$'{"id":2,"productSn":"7437789","name":"Redmi5A","subTitle":"全网通版3GB+32GB香槟金移动联通电信4G手机双卡双待","brandName":"Xiaomi","price":649,"count":5}'JSON.SETproduct:3$'{"id":3,"productSn":"7437799","name":"AppleiPhone8Plus","subTitle":"64GB红色特别版移动联通电信4GMobilePhone","brandName":"apple","price":5499,"count":10}'插入数据成功后,在RedisInsight中会看到如下信息,JSON数据支持格式化和高亮显示;然后就可以通过JSON.GET命令获取JSON类型键值对的值;JSON.GET产品uct:1也只能获取指定属性的值。RedisJSON中,JSON对象中的属性需要以.开头;JSON.GETproduct:1.name.subTitle也可以通过JSON.TYPE命令获取JSON对象类型JSON.TYPEproduct:1.RediSearch通过RediSearch模块,Redis可以成为一个强大的全文搜索引擎,并且原生支持中文搜索,下面就来体验一下吧!在使用RediSearch搜索数据之前,我们必须先创建一个索引。索引的语法有点复杂。我们先来看一下;FT.CREATE{index}[ON{data_type}][PREFIX{count}{prefix}[{prefix}..][LANGUAGE{default_lang}]SCHEMA{identifier}[AS{attribute}][TEXT|数字|地理|TAG][CASESENSITIVE][SORTABLE][NOINDEX]]...可以使用FT.CREATE命令创建索引,语法中参数的含义如下;索引:索引名称;data_type:索引的数据类型,目前支持JSON或HASH;PREFIX:可以用来选择需要索引的数据前缀,比如PREFIX1"product:"表示为key中以product:为前缀的数据创建索引;LANGUAGE:指定TEXT类型属性的默认语言,使用chinese设置为中文;标识符:指定属性名称;attribute:指定属性别名;文字|数字|地理|TAG:这些是可选类型的属性;SORTABLE:指定的属性可以排序。看完语法可能不太好理解,就试着索引一下之前的产品数据;FT.CREATEproductIdxONJSONPREFIX1"product:"LANGUAGEchineseSCHEMA$.idASidNUMERIC$.nameASnameTEXT$.subTitleASsubTitleTEXT$.priceASpriceNUMERICSORTABLE$.brandNameASbrandNameTAG索引后是建立后,我们可以使用FT.SEARCH查看数据,例如使用*查询全部;FT.SEARCHproductIdx*因为我们将price字段设置为SORTABLE,可以按照价格降序返回商品信息;FT.SEARCHproductIdx*SORTBYpriceDESC也可以指定返回字段;FT.SEARCHproductIdx*RETURN3namesubTitleprice我们将brandName设置为TAG类型,我们可以使用如下语句查询品牌为小米或苹果的产品;FT.SEARCHproductIdx'@brandName:{小米|Apple}'由于价格是NUMERIC类型,我们可以使用如下语句查询价格在500到1000之间的商品;英尺。SEARCHproductIdx'@price:[5001000]'也可以通过前缀进行模糊查询,类似于SQL中的LIKE,用*表示;FT.;FT.SEARCHproductIdx'@subTitle:red'可以通过FT.DROPINDEX命令删除索引,如果加上DD选项,会连同数据一起删除;FT.DROPINDEXproductIdx可以通过FT.INFO命令查看索引状态;FT.INFOproductIdx红色iSearch的搜索语法比较复杂,但是我们可以用它来和SQL做对比。具体可以参考下表对比Elasticsearch。Redis官方公布了RediSearch和Elasticsearch的性能对比测试。索引能力索引维基百科的560万(5.3GB)文档,RediSearch需要221s,Elasticsearch需要349s,RediSearch快了58%!查询能力数据被索引后,使用32个客户端检索两个词。RediSearch的吞吐量达到12.5Kops/sec,Elasticsearch的吞吐量达到3.1Kops/sec。RediSearch比Elasticsearch快4倍。同时RediSearch的延迟是8ms,而Elasticsearch是10ms,RediSearch的延迟稍微低一点!总结经过这么多年的发展,Redis已经越来越强大了。它不仅仅是一个缓存工具,更像是一个数据库。RediSearch给了我们实现搜索功能的另一种选择,性能也很不错。如果你想做搜索相关的功能,可以考虑一下!如果想深入了解Redis实战技巧,可以试试这个实战项目,全套教程(50K+Star):https://github.com/macrozheng/mall参考官方文档:https://developer.redis.com/h...参考手册:https://oss.redis.com/redisea...性能测试:https://redis.com/blog/search...
