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

自己做网站必须要学哪些一家专门做护肤的网站

自己做网站必须要学哪些,一家专门做护肤的网站,wordpress写文章插件,分销商城源码php导读 在日常生活中#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.yutouwan.com/news/155637/

相关文章:

  • 建个网站需要多少钱?上海网站建设 分类广告
  • 青海省建设厅网站备案资料个人网页设计实训报告
  • 昆明航空公司官方网站windows优化大师免费
  • 给网站做推广网站子网页怎么做
  • 高唐做网站建设的公司建站 备案
  • 在哪里可以做公司网站临清建网站
  • 国外建筑网站app百度下载app下载安装
  • 用jsp做网站的代码无锡本地模板网站建设产品
  • 青岛房产网站外链网站是什么
  • 网站管理助手ftp白云做网站SEO
  • 怎样才能建设只是于自己的网站河北专业网络营销收费公司
  • 中国住房和建设部网站首页问答论坛网站建设
  • 网站自己做还是找公司软文网站大全
  • 怎么做中英文双语网站深圳企业网站建设
  • 甘肃省建设厅网站首页网站如何做h5动态页面
  • 上海门户网站制广东网站设计费用
  • 做网站需要的图片中国建设工程质量安全管理协会网站
  • 个人网站 建设宿迁房产交易中心官网
  • 网站开发 入门教程企业邮箱注册申请126官网
  • 做物流哪个网站货源多英文外贸网站源码
  • 网站建设 维护 编程如何在网站做淘宝页面
  • 百度搜索官方网站昆山网站建设ikelv
  • 德阳建设厅官方网站阳西县网络问政平台公众号
  • 给卖假性药的做网站一般要判多久搭建一个网站需要多少钱?
  • 网站建设交印花税嘛中铁建设中南分公司
  • 成都网站建设询q479185700霸屏工程施工行业在哪个网站容易找事做
  • 青岛网站推广招商免费做手机网站
  • 有用unity做网站的吗有些网址打不开怎么解决
  • 邯郸网站建设联系电话两峡一峰旅游开发公司官方网站
  • 安徽中机诚建建设有限公司网站网站克隆 有后台登录