当前位置: 首页 > 后端技术 > Java

可能是全网第一个使用RediSearch的项目

时间:2023-04-02 10:40:59 Java

瀹為檯椤圭洰鍦板潃鏄痭ewbeemall銆傚畠闆嗘垚浜哛ediSearch銆傚紑婧愪唬鐮佸凡涓婁紶銆傛敮鎸佺殑璇濆彲浠ョ偣涓猻tar馃榿RediSearch鍩轰簬Redis锛屾敮鎸佷簩绾х储寮曘€佹煡璇㈠紩鎿庡拰鍏ㄦ枃鎼滅储搴旂敤銆?.0鐗堟湰锛岀畝鍗曠湅涓€涓嬪畼缃戞祴璇曟姤鍛婏細绱㈠紩鏋勫缓鍦ㄧ储寮曟瀯寤烘祴璇曚腑锛孯ediSearch鐢ㄦ椂221绉掕秴杩嘐lasticsearch鐨?49绉掞紝棰嗗厛58%銆傚湪鏌ヨ鎬ц兘鏁版嵁闆嗚绱㈠紩鍚庯紝鎴戜滑浣跨敤32涓鎴风鍦ㄤ笓鐢ㄨ礋杞界敓鎴愬櫒鏈嶅姟鍣ㄤ笂杩愯瀹冿紝鍙戣捣浜嗕竴涓弻璇嶆悳绱㈡煡璇€傚涓嬪浘鎵€绀猴紝RediSearch鐨勫悶鍚愰噺杈惧埌浜?2.5Kops/sec锛岃€孍lasticsearch鐨勫悶鍚愰噺杈惧埌浜?.1Kops/sec锛屽揩浜?鍊嶃€傛澶栵紝涓嶦lasticsearch鐨?0姣鐩告瘮锛孯ediSearch鐨勫欢杩熺◢濂戒竴浜涳紝骞冲潎涓?姣銆?ops/secoperationspersecond)鍙互鐪嬪嚭锛屾柊鐨凴ediSearch鍦ㄦ€ц兘涓婃瘮RediSearch鏇存湁浼樺娍銆傛澶栵紝瀵逛簬涓浗椤圭洰锛屼腑鍥界殑鏀寔蹇呬笉鍙皯銆俁ediSearch鍦ㄥ畼缃戞枃妗d腑涔熶笓闂ㄥ垪鍑轰簡瀵逛腑鏂囩殑鏀寔锛屼竴涓熀浜巉risoC璇█寮€鍙戠殑涓枃鍒嗚瘝椤圭洰銆?銆佸畨瑁匯ediSearchDocker瀹夎鏈€鏂扮増鏈琩ockerrun-p6379:6379redislabs/redisearch:latest閫氳繃redis-cli杩炴帴鏌ョ湅RediSearch鏄惁瀹夎鎴愬姛1.redis-cli-hlocalhost2.modulelist82.157.141.70:16789>MODULELIST1)1)"name"2)"search"#妫€鏌ユ槸鍚﹀寘鍚悳绱㈡ā鍧?)"ver"4)(integer)202102)1)"name"2)"ReJSON"#妫€鏌ユ槸鍚﹀寘鍚寘鍚玆eJSON妯″潡3)"ver"4)(integer)200072.瀹㈡埛绔泦鎴愬浜嶫ava椤圭洰锛屽彲浠ョ洿鎺ラ€夋嫨Jedis4.0鐗堟湰銆侸edis鍦?.0鐗堟湰涓嚜鍔ㄦ敮鎸丷ediSearch銆傚啓涓€涓狫edis杩炴帴RedisSearch鐨勬祴璇曠敤渚嬶紝鐢≧edisSearch鍛戒护鍒涘缓锛屽涓嬶細:goods绱㈠紩鍚嶇О//hash绱㈠紩鏁版嵁鏄熀浜巋ash绫诲瀷婧愭暟鎹瀯寤虹殑//鍓嶇紑1"goods:"琛ㄧず寰呯储寮曟簮鏁版嵁鐨勫墠缂€鍖归厤瑙勫垯//languagechinese琛ㄧず鏀寔涓枃鍒嗚瘝//schema琛ㄧず瀛楁瀹氫箟锛実oodsName鍏冩暟鎹睘鎬у悕绉版枃鏈瓧娈电被鍨媠ortable鑷冻鎺掑簭FT.INFOidx:goods//FT.INFO鏌ヨ鎸囧畾鍚嶇О绱㈠紩淇℃伅FT.DROPINDEXidx:goods//FT.DROPINDEX鍒犻櫎鎸囧畾鍚嶇О绱㈠紩鑰屼笉鍒犻櫎婧愭暟鎹€傛坊鍔犵储寮曟椂锛屼娇鐢╤set鍛戒护娣诲姞绱㈠紩婧愭暟鎹€傚垹闄ょ储寮曟椂锛屼娇鐢╠el鍛戒护鍒犻櫎绱㈠紩婧愭暟鎹甁edis鍒涘缓RediSearch瀹㈡埛绔疈BeanpublicUnifiedJedisunifiedJedis(GenericObjectPoolConfigjedisPoolConfig){UnifiedJedisclient;if(StringUtils.isNotEmpty(password)){client=newJedisPooled(jedisPoolConfig,host,port,timeout,password,database);client=client=newnewJedisPooled(jedisPoolConfig,host,port,timeout,null,database);}returnclient;}Jedis鍒涘缓绱㈠紩@TestpublicvoidcreateIndex(){System.out.println("begin");鏋舵瀯鏋舵瀯=鏂版灦鏋勶紙锛夈€俛ddSortableTextField("goodsName",1.0).addSortableTextField("goodsIntro",0.5).addSortableTagField("tag","|");jedisSearch.createIndex(idxName,"鍟嗗搧",鏋舵瀯);System.out.println("end");}/***鍒涘缓绱㈠紩**@paramidxName绱㈠紩鍚嶇О*@paramprefix瑕佺储寮曠殑鏁版嵁鍓嶇紑*@paramschema绱㈠紩瀛楁閰嶇疆*/publicvoidcreateIndex(StringidxName,Stringprefix,Schemaschema){IndexDefinition瑙勫垯=newIndexDefinition(IndexDefinitiontion.Type.HASH).setPrefixes(prefix).setLanguage(Constants.GOODS_IDX_LANGUAGE);#璁剧疆瀵逛腑鏂囧垎璇嶇殑鏀寔client.ftCreate(idxName,IndexOptions.defaultOptions().setDefinition(rule),schema);}Jedis娣诲姞绱㈠紩婧愭暟鎹?***娣诲姞绱㈠紩鏁版嵁**@paramkeyPrefix瑕佺储寮曠殑鏁版嵁鍓嶇紑*@paramgoods鍟嗗搧淇℃伅*@returnboolean*/publicbooleanaddGoodsIndex(StringkeyPrefix,Goodsgoods){Maphash=MyBeanUtil.toMap锛堝晢鍝侊級锛沨ash.put("_language",Constants.GOODS_IDX_LANGUAGE);client.hset(keyPrefix+goods.getGoodsId(),MyBeanUtil.toMap(goods));returntrue;}Jedis涓枃鏌ヨpublicSearchResultsearch(StringgoodsIdxName,SearchObjVOsearchObjVO,Pagepage){Stringkeyword=searchObjVO.getKeyword();//鏌ヨ鍏抽敭瀛桽tringqueryKey=String.format("@goodsName:(%s)",keyword);鏌ヨq=newQuery(queryKey);瀛楃涓叉帓搴?searchObjVO.getSidx();瀛楃涓查『搴?searchObjVO.getOrder();//鏌ヨ鏄惁鎺掑簭if(StringUtils.isNotBlank(sort)){q.setSortBy(sort,Constants.SORT_ASC.equals(order));}//璁剧疆涓枃鍒嗚瘝鏌ヨq.setLanguage(Constants.GOODS_IDX_LANGUAGE);//鏌ヨ椤甸潰q.limit((int)page.offset(),(int)page.getSize());//杩斿洖鏌ヨ缁撴灉returnclient.ftSearch(goodsIdxName,q);}3.鍦ㄥ疄闄呴」鐩腑寮曞叆Jedis4.04.2.0redis.clientsjedis${jedis.version}鍦╪ewbeemall椤圭洰鍚庡彴浜у搧绠$悊涓坊鍔犲悓姝ユ寜閽苟缂栧啓涓€涓畬鏁寸殑浜у搧鍚屾鎸夐挳銆備负浜嗗姞蹇悓姝ラ€熷害锛屽皢浜у搧鍚屾鍒癛ediSearchpublicbooleansyncRs(){jedisSearch.dropIndex(Constants.GOODS_IDX_NAME);Schemaschema=newSchema().addSortableTextField("goodsName",1.0).addSortableTextField("goodsIntro",0.5).addSortableNumericField("goodsId").addSortableNumericField("sellingPrice").addSortableNumericField("originalPrice鈥濓級.GOODS_IDX_PREFIX);returnjedisSearch.addGoodsListIndex(Constants.GOODS_IDX_PREFIX,list);}/***鍚屾鍟嗗搧鏌ヨ**@paramkeyPrefix瑕佹煡璇㈢殑鏁版嵁鍓嶅*@returnboolean*/publicbooleanaddGoodsListIndex(StringkeyPrefix,Listlist){intchunk=200;intsize=list.size();intceil=(int)Math.ceil(size/(double)chunk);//澶氱嚎绋嬪簭鍚屾List>futures=newArrayList<>(4);for(inti=0;isize){toIndex=i*chunk+size%chunk;}ListsubList=list.subList(i*chunk,toIndex);CompletableFuturevoidCompletableFuture=CompletableFuture.supplyAsync(()->subList).thenAccept(goodsList->{for(Goodsgoods:goodsList){Maphash=MyBeanUtil.toMap(goods);hash.put("_language",Constants.GOODS_IDX_LANGUAGE);client.hset(keyPrefix+goods.getGoodsId(),MyBeanUtil.toMap(goods));}});futures.add(voidCompletableFuture);}CompletableFuture.allOf(futures.toArray(newCompletableFuture[0])).join();returntrue;}淇敼鍟嗗搧椤甸潰鎼滅储鎺ュ彛@GetMapping("/search")publicStringrsRearch(SearchObjVOsearchObjVO,HttpServletRequestrequest){Pagepage=getPage(request,Constants.GOODS_SEARCH_PAGE_LIMIT);...//RediSearch涓枃鎼滅储SearchResultquery=jedisSearch.search(Constants.GOODS_IDX_NAME,searchObjVO,page);...return"mall/search";}鏌ョ湅鎼滅储缁撴灉鏄惁鍖呭惈鈥滃皬绫斥€濆拰鈥滄墜鏈衡€濆垎璇?.鎬荤粨閫氳繃浠ヤ笂瀹炶返椤圭洰锛屼娇鐢≧ediSearch鍙互婊¤冻鍩烘湰涓枃鍒嗚瘝鐨勯珮绾х敤娉曡仛鍚堟煡璇€佺粨鏋滈珮浜€佸仠鐢ㄨ瘝銆佹墿灞旳PI銆佹嫾鍐欑籂姝c€佽嚜鍔ㄨˉ鍏ㄧ瓑閮藉彲浠ュ湪瀹樼綉瀛︿範銆傛渶鍚庤创鍑哄疄闄呴」鐩湴鍧€newbeemall锛岄泦鎴怰ediSearch锛屽紑婧愪唬鐮佸凡涓婁紶