范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

微服务SpringBoot整合RedisGEO实现附近商户功能

  在点评项目中 如何 实现 附近商家的查询呢,展示出距离自己5公里内的商户,这样的功能如何实现?
  答案是可以采用Redis 来实现,当然可能有很多实现方式,本文主要介绍如何使用Redis实现 附近商户的搜索功能一、Redis GEO 数据结构用法
  GEO基本语法、指令
  GEO 就是 GeoLocation 的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。
  常见的命令GEOADD:添加一个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)GEODIST:计算指定的两个点之间的距离并返回GEOHASH:将指定member的坐标转为hash字符串形式并返回GEOPOS:返回指定member的坐标GEORADIUS:指定圆心、半径,找到该圆内包含的所有member,并按照与圆心之间的距离排序后返回。6.以后已废弃GEOSEARCH:在指定范围内搜索member,并按照与指定点之间的距离排序后返回。范围可以是圆形或矩形。6.2.新功能GEOSEARCHSTORE:与GEOSEARCH功能一致,不过可以把结果存储到一个指定的key。 6.2.新功能使用GEO存储经纬度、查询距离
  本篇博文 Redis版本为 6.2版本
  进入redis 查询 geo相关指令
  使用 GEO 完成以下功能 实现两点之间的距离查询,以及指定范围内的地点
  需求如下:使用 GEO 添加 北京 (天安门 116.397469 39.908821 、故宫 116.397027 39.918056、北海公园 116.389977 39.933144) 经纬度查询 天安门 与 故宫之间的距离在以上添加的地点中查询 天安门广场 (116.397827 39.90374) 附近2公里的地点
  GEOADD 添加
  GEOPOS 查看指定地点 经纬度信息
  GEOHASH 查看指定地址 经纬度HASH值
  拓展: GEOPOS 和 GEOHASH 的区别在于 GEOHASH 节约了 经纬度存储的 内存、减少不必要的内存消耗,从而提升性能
  GEODIST 查看 天安门 与故宫之间的距离
  GEOSEARCH 查询 天安门广场 附近 2公里的地点
  二、SpringBoot 整合Redis 导入 店铺数据 到GEO
  编写SpringBoot 单元测试进行导入Redis数据@Resource private IShopService shopService;  @Resource private StringRedisTemplate stringRedisTemplate;  @Test void loadShopData() {     //1. 查询店铺信息     List shopList = shopService.list();     //2. 把店铺分组,按照typeId分组、typeId一致的放在一个集合     Map> map = shopList.stream().collect(Collectors.groupingBy(Shop::getTypeId));     //3. 分批完成写入redis     for (Map.Entry> entry : map.entrySet()) {         //3.1 获取类型id         Long typeId = entry.getKey();         String key = RedisConstants.SHOP_GEO_KEY + typeId;         //3.2 获取同类型的店铺的集合         List value = entry.getValue();         List> locations = new ArrayList<>(value.size());         //3.3 写入redis GEOADD key 经度 维度 member         for (Shop shop : value) {             locations.add(new RedisGeoCommands.GeoLocation<>(                 shop.getId().toString(),                 new Point(shop.getX(), shop.getY())));         }         stringRedisTemplate.opsForGeo().add(key, locations);     }  }
  运行完毕,查看Redis即可
  三、SpringBoot 整合 Redis 实现 附近商户功能
  需求介绍
  实现附近商户查询功能采用GEO 数据结构实现附近商户查询完成分页功能
  思路分析:
  通过传输过来的 x、y 经纬度,然后我们根据该经纬度去查询redis中附近的商户,查出后即可返回,进行封装,查出来的结果进行循环添加至 Shop 地点距离,即可完成。核心源码
  ShopController@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); }
  ShopService@Override public Result queryShopByType(Integer typeId, Integer current, Double x, Double y) {     //1. 判断是否需要坐标查询     if (x == null || y == null) {         // 不需要坐标查询,按数据库查询         Page page = query()             .eq("type_id", typeId)             .page(new Page<>(current, SystemConstants.DEFAULT_PAGE_SIZE));         // 返回数据         return Result.ok(page.getRecords());     }     //2. 计算分页参数     int form = (current - 1) * SystemConstants.DEFAULT_PAGE_SIZE;     int end = current * SystemConstants.DEFAULT_PAGE_SIZE;     //3. 查询redis,按照距离排序、分页 结果:shopId、distance     String key = RedisConstants.SHOP_GEO_KEY + typeId;     GeoResults> results = stringRedisTemplate.opsForGeo().search(         key,         GeoReference.fromCoordinate(x, y),         new Distance(5000),         RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance().limit(end));     //4. 解析id     if (results == null) {         return Result.ok(Collections.emptyList());     }     List>> content = results.getContent();     //4.1 截取from => end     List ids = new ArrayList<>(content.size());     Map distanceMap = new HashMap<>(content.size());     if (content.size() <= form) {         return Result.ok(Collections.emptyList());     }     content.stream().skip(form).forEach(result -> {         //4.2 获取店铺id         String shopIdStr = result.getContent().getName();         ids.add(Long.valueOf(shopIdStr));         //4.2 获取距离         Distance distance = result.getDistance();         distanceMap.put(shopIdStr, distance);     });     //5. 根据id查询shop     String idStr = StrUtil.join(",", ids);     List shops = query().in("id", ids).last("ORDER BY FIELD(id," + idStr + ")").list();     // 循环将 商品距离放入对象距离属性中     shops.forEach(shop -> {         shop.setDistance(distanceMap.get(shop.getId().toString()).getValue());     });     //6. 返回结果     return Result.ok(shops); }
  进行测试
  作者:Bug终结者_
  链接:https://juejin.cn/post/7187937697883750457

9月23日公开宣判,唐山打人案庭审细节曝光,陈某志痛哭流涕根据廊坊市广阳区人民法院公告栏中一份盖有法院公章的公告显示,该院将对陈继志一案进行公开宣判9月23日9时30分犯寻衅滋事非法拘禁寻衅滋事故意伤害开设赌场抢劫掩饰隐瞒犯罪所得帮助信息卫冕冠军!外媒列法国队世界杯首发,博格巴无缘,克罗斯入选还有两个月的时间,2022年卡塔尔世界杯的大幕就将拉开,这项全球狂欢的体育盛宴将吸引无数人的目光,成为这个冬天举世瞩目的焦点而要说夺冠热门,那么法国队绝对名列其中。2018年俄罗斯原神游戏设计细节分析蒙德璃月稻妻,都有两个周本。无一例外,两个周本一个来自主线任务,另一个来自传说任务。而且主线任务往往是该地区最后一个主线任务。所以大胆预测须弥剧情最后一章必有BOSS,这个BOSS12到01!卫冕冠军法国一胜难求,面对保级生死战,剑指首胜头条创作挑战赛经过3个多月的休整,欧洲国家联赛(简称欧国联)即将重燃战火,各路豪强迎来晋级与保级关键时刻,在小组仅剩2轮的情况下,本轮比赛显得尤为重要。小组战罢4轮,表现最为拉胯的一场本应避免的意外!外媒时隔三年半披露萨拉空难细节,事前已发现飞机有问题如果那个意外没有发生,阿根廷球员萨拉现在或许早已经能帮助卡迪夫城在英超站稳脚跟了,而他或许也有机会亮相世界杯。但这一切都因为2019年的那一次意外成为了泡影。萨拉乘坐的小型飞机坠毁韩国性感女神李成敏,公开表白古天乐在中国发展多年的韩国性感女神,近日在一档采访中,被问及到比较中意的男性艺人是谁?李成敏毫不犹豫的直接表明就是曾一起合作过的古天乐,不少网友表示这就是蹭古校长的热度,你么机会的!近些走到今天,45岁靳东,终究还是没有陆毅的命,没有刘德华的运虽然我不想这么说,但事实就是靳东,走到今天还是挺尴尬的,实力配不上现有的资源。我翻了一下靳东的资料,靳东的头衔挺多的,他是国家一级演员,中国煤矿文工团的副团长,电视协会的副会长,怎不可一世的马苏,走到今天这一步,难道仅仅是因为包庇闺蜜?近日,由尔冬升导演,陈宝国马苏阿云嘎等主演的电影海的尽头是草原上映。马苏在其中饰演萨仁娜,可以说马苏能够得到这么一个角色与其他演员相比更不容易。曾经的马苏外号马漂亮,在娱乐圈虽然不五菱大疆精品PLUS?解读2023款KiWiEV跨界合作,在如今的车圈来说并不是什么新鲜事,像华为百度阿里等企业,都开始涉足汽车领域了。在这方面,为人民造好车的五菱也不甘落后,携手无人机巨头企业大疆,联合研发了一套灵犀智驾系统,8月B级车雅阁再夺月度销冠奥迪A4L实现反超来源中国经济网张懿合资B级车市场之中,日系品牌延续销量高增长态势。8月,雅阁今年第三度超越凯美瑞,共售出新车23093辆,夺得月度销冠。雅阁凯美瑞成为当月唯二销量超两万车型。然而从多次流产,是身体哪里出问题了吗?许多女性在经历了12次的意外的流产后,对于怀孕会变得小心翼翼又异常焦虑。一次的自然流产可能是偶然现象,但是要警惕演变成复发性流产。连续发生3次或3次以上的自然流产就叫做复发性流产,
钟薛高的局部胜利与全面溃败钟薛高是我老婆的一生之敌。2021年夏,妻子在网上买了一整箱钟薛高。当时正值66元厄瓜多尔粉钻雪糕频上热搜,创始人林盛的那句它就那么贵,你爱要不要(后被证明为恶意剪辑)在各个平台流7月起,灵活就业人员社保最低缴费上调,还有俩好消息我国的老百姓的生活保障福利是越来越丰富的,社保就是其中之一,大部分城市地区的人都购买了社保,在有公司为其缴纳社保的情况下,人们的社保缴纳压力也很低,可以几乎忽略。不过,对于灵活就业曼德拉效应有多可怕?竟然能偷走人的记忆?这些情况你一定遇到过口字旁的当真的不存在吗?神奇的曼德拉效应究竟是什么?今天,我们就来辟谣一下所谓神奇的曼德拉效应。看看这几种现象你有没有中招?叮当猫首先,我们来聊一下网传的曼德拉效应究竟是怎么来的。我们躬耕于黑暗,却侍奉于光明!中国历史上的四大刺客最近,某国前首相遇刺身亡,在我国也激起了千层浪。大致分为了两拨一拨叫好,一拨同情!同情之人往往认为死者为大,坚持秉承以德报怨优良传统,认为就算其任职期间对中国犯下很多错误,但随着遇王者荣耀克制回血脆皮噩梦!宫本武藏已成S28赛季最强打野?S28赛季宫本武藏增强了一重势强化普攻伤害,表现逐渐步入正轨,目前已经成为了KPL职业赛场的主流打野。在佛山DRG。GK对阵成都AG超玩会的比赛中,GK鹏鹏的宫本武藏完成了两次四杀西班牙人阵容大洗牌,武磊面临全新挑战记者寒冰报道7月4日,西班牙人正式开始了新赛季的训练备战。例行的体检和报到之中,新援前锋何塞卢和左后卫奥利万都已到队,武磊也结束休假归队。因为夏季球队的大清洗,新帅不得不从B队上调A股黑色星期一三大股指跌幅均超1,题材炒作大跌,明天怎么走?我在周末的文章已经明确说了,这波题材炒作基本上结束了,很多人觉得还会走一波行情。今天题材炒作大跌,尤其是锂矿和汽车板块跌幅很大,再好的题材炒作,一旦涨幅巨大,风险就更大,结局都是一最准确猪价预测(预测的逻辑)道是底层逻辑法是普遍规律一隐一显,互为论证。只要是那些重复发生,并且具有固定频率的,就能够建立一个预测模型,在已知与未知之间架起一座桥梁,找到通往未来的路。猪周期就是这样,找到底层张帅无缘温网女双冠军获205万奖金本赛季有望登顶女双第一北京时间7月11日凌晨,在温网女双决赛中,张帅梅尔滕斯2646不敌2号种子克莱奇科娃西尼亚科娃组合,张帅无缘首次赢得温网女双冠军。张帅梅尔滕斯作为本届温网女双头号种子,前四轮不失一中超最新排名冠军队守住第2,浙江跃升前8,谢晖连败接近降级区中超联赛第一阶段最后一轮比赛继续进行,卫冕冠军山东泰山31战胜大连人,继续巩固自己积分榜第二的位置。升班马浙江队20轻取广州城,在先赛一场的情况下,排名已经上升到第七名,成为了目前奈良县警本部长这是我27年警察生涯最大的悔恨据日本产经新闻7月10日报道,日本奈良县警本部长鬼塚友章在9日下午召开的记者会上表示不能否认(安倍先生的)安保工作出了问题。关于安倍遇袭当天的安保工作,他承认有必要重新复盘。据报道