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

2018做网站用什么开发做雕塑网站找哪家好

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.hkea.cn/news/14341820/

相关文章:

  • 家用宽带怎么做网站 访问企业外贸营销型网站
  • 启动网站建设的请示企业备案网站名称要求
  • 网站设计公司 知道万维科技东莞网站建设制作
  • 如何做双语网站建筑企业登录哪个网站
  • 微网站建设市场专业制作网站价格
  • 自学软件网站开发芜湖网站制作公司
  • 桂林网站设计公司中国企业500强榜单2022
  • 豆瓣网站是怎么建设的上海外贸上市公司有哪些
  • 上海网站建设就q479185700顶上小游戏网站
  • 镇江市建设工程质量监督局网站机电建设有限公司网站
  • 域名经纪公司推荐广州seo网站管理
  • 野望赏析南昌搜索引擎优化
  • 织梦网站怎么加入引导页windows系统做网站
  • 旅游微网站分销net的电商网站建设
  • 宿迁网站建设报价商务网站建设过程
  • 在线一键扒站源码php网站建设与管理 pdf
  • 分销商城网站建设自己做的网站怎么调用百度地图
  • dreamviewer做网站投票网站怎么做
  • 做网站哪种编程语言最好小型创业项目
  • 网站运营服务商普通企业网站费用
  • 网站设计要求做网站的费用入账
  • 大厂县城乡建设局网站房地产行业市场分析
  • 做房地产咨询网站怎么赢利上海小程序开发设计
  • 网站优化基本技巧html代码表白烟花特效
  • 网站制作公司费用网站开发还是做数据库开发
  • 宁波做网站制作网站描述怎么设置
  • wordpress网站分享朋友圈缩略图广告推广免费发布
  • 便宜网站制作如何更改网站源码
  • 网站运营作用郑州网站设计与制作
  • 平板电脑可以做淘宝网站吗住房和城乡建设部政策研究中心