Bug如山勤为径代码似海苦作舟。友友们好这里是苦瓜大王。今天学习的是黑马点评项目实战篇——附近商铺部分的学习这个章节后半部分有些难理解建议多看几遍哦今天我们将完成显示附近商铺距离功能。笔记如下后续会一直更新黑马点评学习过程中的笔记、问题等请多多支持哦文章目录一、GEO数据结构二、导入店铺数据到GEO三、附近商户搜索一、GEO数据结构案例添加数据计算距离搜索建筑二、导入店铺数据到GEO不是滚动查询是传统的分页查询一般用户坐标由后台获取但是这里先在前端写死在单元测试里导入店铺数据到GEO将数据库表中的数据导入到redis中去redis中的GEOGEO在redis中就一个menber和一个经纬度我们把x和y轴传入到redis做的经纬度位置去但我们不能把所有的数据都放入到menber中去毕竟作为redis是一个内存级数据库如果存海量数据redis还是力不从心所以我们在这个地方存储他的id即可。HmDianPingApplicationTests代码利用stream流进行分组Test------------------------------HmDianPingApplicationTests--------------------------------voidloadShopData(){// 1.查询店铺信息ListShoplistshopService.list();// 2.把店铺分组按照typeId分组typeId一致的放到一个集合MapLong,ListShopmaplist.stream().collect(Collectors.groupingBy(Shop::getTypeId));// 3.分批完成写入Redisfor(Map.EntryLong,ListShopentry:map.entrySet()){// 3.1.获取类型idLongtypeIdentry.getKey();StringkeySHOP_GEO_KEYtypeId;// 3.2.获取同类型的店铺的集合ListShopvalueentry.getValue();ListRedisGeoCommands.GeoLocationStringlocationsnewArrayList(value.size());// 3.3.写入redis GEOADD key 经度 纬度 memberfor(Shopshop:value){// stringRedisTemplate.opsForGeo().add(key, new Point(shop.getX(), shop.getY()), shop.getId().toString());locations.add(newRedisGeoCommands.GeoLocation(shop.getId().toString(),newPoint(shop.getX(),shop.getY())));}stringRedisTemplate.opsForGeo().add(key,locations);}}三、附近商户搜索SpringDataRedis的2.3.9版本并不支持Redis 6.2提供的GEOSEARCH命令因此我们需要提示其版本修改自己的POM导入pomdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactIdexclusionsexclusionartifactIdspring-data-redis/artifactIdgroupIdorg.springframework.data/groupId/exclusionexclusionartifactIdlettuce-core/artifactIdgroupIdio.lettuce/groupId/exclusion/exclusions/dependencydependencygroupIdorg.springframework.data/groupIdartifactIdspring-data-redis/artifactIdversion2.6.2/version/dependencydependencygroupIdio.lettuce/groupIdartifactIdlettuce-core/artifactIdversion6.1.6.RELEASE/version/dependency2. 改造根据商铺类型分页查询商铺信息ShopController/** * 根据商铺类型分页查询商铺信息 * return 商铺列表 */GetMapping(/of/type)publicResultqueryShopByType(RequestParam(typeId)IntegertypeId,RequestParam(valuecurrent,defaultValue1)Integercurrent,RequestParam(valuex,requiredfalse)Doublex,RequestParam(valuey,requiredfalse)Doubley){returnshopService.queryShopByType(typeId,current,x,y);}ShopServiceImpl/** * 根据商铺类型分页查询商铺信息 * return 商铺列表 */OverridepublicResultqueryShopByType(IntegertypeId,Integercurrent,Doublex,Doubley){// 1.判断是否需要根据坐标查询if(xnull||ynull){// 不需要坐标查询按数据库查询PageShoppagequery().eq(type_id,typeId).page(newPage(current,SystemConstants.DEFAULT_PAGE_SIZE));// 返回数据returnResult.ok(page.getRecords());}// 2.计算分页参数intfrom(current-1)*SystemConstants.DEFAULT_PAGE_SIZE;intendcurrent*SystemConstants.DEFAULT_PAGE_SIZE;// 3.查询redis、按照距离排序、分页。结果shopId、distanceStringkeySHOP_GEO_KEYtypeId;// GEOSEARCH key BYLONLAT x y BYRADIUS 10 WITHDISTANCEGeoResultsRedisGeoCommands.GeoLocationStringresultsstringRedisTemplate.opsForGeo()// GEOSEARCH key BYLONLAT x y BYRADIUS 10 WITHDISTANCE.search(key,GeoReference.fromCoordinate(x,y),newDistance(5000),RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance().limit(end));// 4.解析出idif(resultsnull){returnResult.ok(Collections.emptyList());}ListGeoResultRedisGeoCommands.GeoLocationStringlistresults.getContent();if(list.size()from){// 没有下一页了结束returnResult.ok(Collections.emptyList());}// 4.1.截取 from ~ end的部分ListLongidsnewArrayList(list.size());MapString,DistancedistanceMapnewHashMap(list.size());list.stream().skip(from).forEach(result-{// 4.2.获取店铺idStringshopIdStrresult.getContent().getName();ids.add(Long.valueOf(shopIdStr));// 4.3.获取距离Distancedistanceresult.getDistance();distanceMap.put(shopIdStr,distance);});// 5.根据id查询ShopStringidStrStrUtil.join(,,ids);ListShopshopsquery().in(id,ids).last(ORDER BY FIELD(id,idStr)).list();for(Shopshop:shops){shop.setDistance(distanceMap.get(shop.getId().toString()).getValue());}// 6.返回returnResult.ok(shops);}小贴士这里如果代码都正确但是只有第一页能显示店铺距离后面显示不出店铺距离可能是Redis版本过低将redis版本改高一些就好了dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId//改成较高的版本我这里改成2.7.18就好了version2.7.18/version/dependency以上就是黑马点评实战篇——附近商铺部分的学习笔记仅供参考多多支持
【黑马点评学习笔记 | 实战篇 】| 9-附近商铺
Bug如山勤为径代码似海苦作舟。友友们好这里是苦瓜大王。今天学习的是黑马点评项目实战篇——附近商铺部分的学习这个章节后半部分有些难理解建议多看几遍哦今天我们将完成显示附近商铺距离功能。笔记如下后续会一直更新黑马点评学习过程中的笔记、问题等请多多支持哦文章目录一、GEO数据结构二、导入店铺数据到GEO三、附近商户搜索一、GEO数据结构案例添加数据计算距离搜索建筑二、导入店铺数据到GEO不是滚动查询是传统的分页查询一般用户坐标由后台获取但是这里先在前端写死在单元测试里导入店铺数据到GEO将数据库表中的数据导入到redis中去redis中的GEOGEO在redis中就一个menber和一个经纬度我们把x和y轴传入到redis做的经纬度位置去但我们不能把所有的数据都放入到menber中去毕竟作为redis是一个内存级数据库如果存海量数据redis还是力不从心所以我们在这个地方存储他的id即可。HmDianPingApplicationTests代码利用stream流进行分组Test------------------------------HmDianPingApplicationTests--------------------------------voidloadShopData(){// 1.查询店铺信息ListShoplistshopService.list();// 2.把店铺分组按照typeId分组typeId一致的放到一个集合MapLong,ListShopmaplist.stream().collect(Collectors.groupingBy(Shop::getTypeId));// 3.分批完成写入Redisfor(Map.EntryLong,ListShopentry:map.entrySet()){// 3.1.获取类型idLongtypeIdentry.getKey();StringkeySHOP_GEO_KEYtypeId;// 3.2.获取同类型的店铺的集合ListShopvalueentry.getValue();ListRedisGeoCommands.GeoLocationStringlocationsnewArrayList(value.size());// 3.3.写入redis GEOADD key 经度 纬度 memberfor(Shopshop:value){// stringRedisTemplate.opsForGeo().add(key, new Point(shop.getX(), shop.getY()), shop.getId().toString());locations.add(newRedisGeoCommands.GeoLocation(shop.getId().toString(),newPoint(shop.getX(),shop.getY())));}stringRedisTemplate.opsForGeo().add(key,locations);}}三、附近商户搜索SpringDataRedis的2.3.9版本并不支持Redis 6.2提供的GEOSEARCH命令因此我们需要提示其版本修改自己的POM导入pomdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactIdexclusionsexclusionartifactIdspring-data-redis/artifactIdgroupIdorg.springframework.data/groupId/exclusionexclusionartifactIdlettuce-core/artifactIdgroupIdio.lettuce/groupId/exclusion/exclusions/dependencydependencygroupIdorg.springframework.data/groupIdartifactIdspring-data-redis/artifactIdversion2.6.2/version/dependencydependencygroupIdio.lettuce/groupIdartifactIdlettuce-core/artifactIdversion6.1.6.RELEASE/version/dependency2. 改造根据商铺类型分页查询商铺信息ShopController/** * 根据商铺类型分页查询商铺信息 * return 商铺列表 */GetMapping(/of/type)publicResultqueryShopByType(RequestParam(typeId)IntegertypeId,RequestParam(valuecurrent,defaultValue1)Integercurrent,RequestParam(valuex,requiredfalse)Doublex,RequestParam(valuey,requiredfalse)Doubley){returnshopService.queryShopByType(typeId,current,x,y);}ShopServiceImpl/** * 根据商铺类型分页查询商铺信息 * return 商铺列表 */OverridepublicResultqueryShopByType(IntegertypeId,Integercurrent,Doublex,Doubley){// 1.判断是否需要根据坐标查询if(xnull||ynull){// 不需要坐标查询按数据库查询PageShoppagequery().eq(type_id,typeId).page(newPage(current,SystemConstants.DEFAULT_PAGE_SIZE));// 返回数据returnResult.ok(page.getRecords());}// 2.计算分页参数intfrom(current-1)*SystemConstants.DEFAULT_PAGE_SIZE;intendcurrent*SystemConstants.DEFAULT_PAGE_SIZE;// 3.查询redis、按照距离排序、分页。结果shopId、distanceStringkeySHOP_GEO_KEYtypeId;// GEOSEARCH key BYLONLAT x y BYRADIUS 10 WITHDISTANCEGeoResultsRedisGeoCommands.GeoLocationStringresultsstringRedisTemplate.opsForGeo()// GEOSEARCH key BYLONLAT x y BYRADIUS 10 WITHDISTANCE.search(key,GeoReference.fromCoordinate(x,y),newDistance(5000),RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance().limit(end));// 4.解析出idif(resultsnull){returnResult.ok(Collections.emptyList());}ListGeoResultRedisGeoCommands.GeoLocationStringlistresults.getContent();if(list.size()from){// 没有下一页了结束returnResult.ok(Collections.emptyList());}// 4.1.截取 from ~ end的部分ListLongidsnewArrayList(list.size());MapString,DistancedistanceMapnewHashMap(list.size());list.stream().skip(from).forEach(result-{// 4.2.获取店铺idStringshopIdStrresult.getContent().getName();ids.add(Long.valueOf(shopIdStr));// 4.3.获取距离Distancedistanceresult.getDistance();distanceMap.put(shopIdStr,distance);});// 5.根据id查询ShopStringidStrStrUtil.join(,,ids);ListShopshopsquery().in(id,ids).last(ORDER BY FIELD(id,idStr)).list();for(Shopshop:shops){shop.setDistance(distanceMap.get(shop.getId().toString()).getValue());}// 6.返回returnResult.ok(shops);}小贴士这里如果代码都正确但是只有第一页能显示店铺距离后面显示不出店铺距离可能是Redis版本过低将redis版本改高一些就好了dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId//改成较高的版本我这里改成2.7.18就好了version2.7.18/version/dependency以上就是黑马点评实战篇——附近商铺部分的学习笔记仅供参考多多支持