当前位置: 首页 > news >正文

光谷企业网站建设wordpress加载太慢

光谷企业网站建设,wordpress加载太慢,如何做下载网站,wordpress 2018编辑器导读 在日常生活中#xff0c;我们经常能看见查询附近商家的功能。 常见的场景有#xff0c;比如你在点外卖的时候#xff0c;就可能需要按照距离查询附近几百米或者几公里的商家。 本文将介绍如何使用Redis实现按照距离查询附近商户的功能#xff0c;并以SpringBoot项目… 导读 在日常生活中我们经常能看见查询附近商家的功能。 常见的场景有比如你在点外卖的时候就可能需要按照距离查询附近几百米或者几公里的商家。 本文将介绍如何使用Redis实现按照距离查询附近商户的功能并以SpringBoot项目作为举例。 想知道这样的功能是如何实现的吗接着往下看吧 Redis地理位置功能 Redis是一种高性能的键值存储数据库具有快速读写能力和丰富的数据结构支持。在Redis 3.2版本之后它引入了地理位置Geospatial功能使其可以轻松处理与地理位置相关的数据。 地理位置功能的核心数据结构是有序集合Sorted Set它将元素与分数score关联起来。在地理位置功能中分数表示地理位置的经度和纬度而元素则是一个标识符比如商户的ID。 我们只需要在数据库中存储商家的经纬度以商家id作为key经纬度作为value存入redis中就可以通过redis命令来获得以某一个点为圆心一定范围内的商家以及他们之间的距离。 常用命令 1. GEOADD将地理位置添加到有序集合中    使用GEOADD命令可以将一个或多个地理位置添加到有序集合中。语法如下 GEOADD key longitude latitude member [longitude latitude member ...]示例GEOADD stores 116.404 39.915 storeAGEOADD stores 116.418 39.917 storeB 2. GEODIST计算两个位置之间的距离 GEODIST命令用于计算两个位置之间的距离可以指定单位米、千米、英里、英尺等。 GEODIST key member1 member2 [unit]示例GEODIST stores storeA storeB km 3. GEORADIUS按照距离查询位置范围内的元素    GEORADIUS命令用于在指定的地理位置范围内查询元素。它可以按照经纬度坐标和半径来查询还可以限制返回的结果数量。 GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key]示例GEORADIUS stores 116.408 39.916 1 km WITHDIST COUNT 5 4. GEOHASH获取位置的geohash值    GEOHASH命令用于获取指定位置的geohash值geohash是一种将地理位置编码成字符串的方法可以用于快速近似的位置计算。 GEOHASH key member [member ...]示例GEOHASH stores storeA storeB5. GEOPOS获取一个或多个位置的经纬度坐标    GEOPOS命令用于获取一个或多个位置的经纬度坐标。 GEOPOS key member [member ...]示例GEOPOS stores storeA storeB 6. GEORADIUSBYMEMBER根据成员获取范围内的元素    这个命令与GEORADIUS类似但是它以一个已有的成员作为中心点进行查询。 GEORADIUSBYMEMBER key member radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key]示例GEORADIUSBYMEMBER stores storeA 1 km 地理位置功能不仅在查询附近商户等实际应用中非常有用还可以应用于地理分析、位置推荐等领域。它通过利用Redis强大的有序集合数据结构使得处理地理信息变得高效、灵活并且易于集成到现有的应用中。无论是构建LBS应用还是处理位置相关数据Redis的地理位置功能都能为开发者提供强大的支持。 Java代码实现 将数据库中的商家经纬度存入redis 数据库中有一张商家表其中有经度纬度这两个字段。我们可以通过单元测试批量将这些商家的经纬度数据存入redis。key为商家idvalue为经纬度。 /*** 将数据库中的商户坐标添加到缓存*/Testvoid addShopGeo2Redis(){//获取商户集合ListShop list shopService.list();//根据商户类型分类MapLong, ListShop collect list.stream().collect(Collectors.groupingBy(Shop::getTypeId));for (Map.EntryLong, ListShop longListEntry : collect.entrySet()) {Long typeId longListEntry.getKey();String key shop:geo: typeId;//获取商户经纬度ListShop shopList longListEntry.getValue();ListRedisGeoCommands.GeoLocationString locations new ArrayList(shopList.size());for (Shop shop : shopList) { // stringRedisTemplate.opsForGeo().add(key,new Point(shop.getX(),shop.getY()),shop.getId().toString());//先收集完所有商户的地理位置再一次性添加到redislocations.add(new RedisGeoCommands.GeoLocation(shop.getId().toString(),new Point(shop.getX(),shop.getY())));}stringRedisTemplate.opsForGeo().add(key,locations);}} 接口类queryShopByTypetypeIdcurrentxy 定义一个根据商家类型查询所有商家的接口如果前端传来的参数中携带该用户的经纬度则代表需要根据距离查询附近商家。 /*** 根据商铺类型分页查询商铺信息* param typeId 商铺类型* param current 页码* return 商铺列表*/GetMapping(/of/type)public Result queryShopByType(RequestParam(typeId) Integer typeId,RequestParam(value current, defaultValue 1) Integer current,RequestParam(value x, required false) Double x,RequestParam(value y, required false) Double y) {return shopService.queryShopByType(typeId, current, x, y);}服务类queryShopByTypetypeIdcurrentxy 1.首先判断是否经纬度参数x和y是否为空 2.计算分页参数redis无法分页需要手动分页 3.查询redis 4.获取商户id集合 5.根据商户id查询数据库 6.返回 Overridepublic Result queryShopByType(Integer typeId, Integer current, Double x, Double y) {//1.判断是否需要根据坐标查询if(x null || y null){//直接数据库查询PageShop page query().eq(type_id, typeId).page(new Page(current, SystemConstants.DEFAULT_PAGE_SIZE));return Result.ok(page.getRecords());}//2.计算分页参数int from (current - 1) * SystemConstants.DEFAULT_PAGE_SIZE;int end current * SystemConstants.DEFAULT_PAGE_SIZE;//3.查询redis按照距离排序分页。结果shopIddistanceString key SHOP_GEO_KEY typeId;GeoResultsRedisGeoCommands.GeoLocationString results stringRedisTemplate.opsForGeo().search(key,GeoReference.fromCoordinate(x, y),new Distance(5000),RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance().limit(end));//4.解析出idif(results null){return Result.ok(Collections.emptyList());}ListGeoResultRedisGeoCommands.GeoLocationString list results.getContent();if(list.size() from){//没有下一页return Result.ok(Collections.emptyList());}//4.1截取from——end部分ListLong ids new ArrayList(list.size());MapString, Distance distanceMap new HashMap(list.size());list.stream().skip(from).forEach(result - {String shopIdStr result.getContent().getName();ids.add(Long.valueOf(shopIdStr));Distance distance result.getDistance();distanceMap.put(shopIdStr,distance);});//5.根据id查询shopString idStr StrUtil.join(,,ids);ListShop shops query().in(id,ids).last(ORDER BY FIELD(id, idStr )).list();for (Shop shop : shops){shop.setDistance(distanceMap.get(shop.getId().toString()).getValue());}//6.返回return Result.ok(shops);} } 注意点 1.redis查询的结果是从第1条到第end条不能直接返回第begin条到第end条。 那么如何跳过begin前面的记录呢 可以使用stream流的skip方法skip方法中指定参数begin就会跳过前面的begin条记录。 2.通过redis获取的ids集合再使用mybatis-plus使用query().in()进行查询时会破坏数据顺序如何解决 手动指定顺序。在后面加上last(ORDER BY FIELD(id, idStr )).list()。而idStr StrUtil.join(,,ids);
http://www.zqtcl.cn/news/783736/

相关文章:

  • seo整站优化服务盗图来做网站
  • 网站服务器基本要素有哪些交易网站的建设规划
  • 网站开发源代码mvc山东网站推广
  • 深圳建网站兴田德润团队织梦的网站模板免费吗
  • 手机响应式网站怎么做图书馆建设网站注意点
  • 白云做网站要多少钱wordpress指定分类子类
  • 侧导航网站济南网上房地产
  • 做得比较好的公司网站自己可以学做网站吗
  • 陕西省两学一做网站产品推广方案
  • 做网站ps文字有锯齿网站建设项目管理基本要求
  • 大连网站制作的网络科技公司取名创意
  • 哈尔滨企业网站建站推荐专业微网站营销
  • 阿里云模板建站怎么样上海免费建站模板
  • 中企动力网站建设合同织梦商业网站内容管理系统
  • 厦门石材网站建设个人网页模板制作
  • 网站建设责任分工手机兼职群
  • 做网站维护的收入怎么确认网校网站毕业设计的方案
  • 商丘网站建设想象力网络普洱做网站的报价
  • wordpress前端是什么网站建设备案优化
  • 琼海市建设局网站网络宣传网站建设制作
  • 怎样做返利网站apple私人免费网站怎么下载
  • 靖宇东兴自助建站深圳网站建设 排行榜
  • 怎样编辑网站梅州免费建站
  • 桂林北站怎么去阳朔简易网页
  • 百度123123网址大全无忧网站优化
  • 做个人网站用什么程序怎么建设一个人自己网站
  • 怎么样建设网站网站通州建设局网站
  • 网站备案有期限吗洛阳宣传片制作公司
  • 给wordpress添加引导页seo营销的策略有哪些
  • 聚美联盟网站怎么做金空间网站