【Redis】GEO数据类型之附近的店铺实现

这篇具有很好参考价值的文章主要介绍了【Redis】GEO数据类型之附近的店铺实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、GEO

1、概念

2、相关命令

1.GEOADD

2.GEODIST

3.GEOHASH

4.GEOPOS

5.GEORADIUS

6.GEOSEARCH

7.GEOSEARCHSTORE

二、附近的店铺

1、实现思路

2、代码实现


一、GEO

1、概念

GEO全称Geolocation,Redis种的一种数据结构他代表地理坐标

2、相关命令

1.GEOADD

向redis中添加一个地理空间信息,其中包含经度、维度、值(member)

2.GEODIST

计算两个指定点之间的距离并返回

3.GEOHASH

将指定member的坐标转为hash字符串形式并返回

4.GEOPOS

返回指定member的左边

5.GEORADIUS

指定圆心、半径、找到该圆内包含的所有member,并按照与圆心之间的距离排序后返回。6.2以后已经废弃

6.GEOSEARCH

在指定的范围内搜索member,并按照与指定点之间的距离进行排序后返回,这个范围可以是矩形也可以是圆形

7.GEOSEARCHSTORE

与第六个相同,不过该命令可以将结果存储到一个指定的key中

二、附近的店铺

1、实现思路

在数据库层面,我们在店铺表上维护两个字段分别是x、y对应经纬度,然后将这些店铺的类型id作为geo数据类型的key将该类型对应的店铺id作为member以及经纬度xy存入member对应的经纬度中,首先我们需要将查出来的店铺信息通过代码(推荐使用Stream流)将相同类型店铺存的id作为key在同一个的map中,然后遍历该集合以类型id作为redis的key的组成,将店铺id与经纬度存入geo中,此时当客户端传来要查询的店铺类型与用户自身的地理位置时,我们只需要通过上述geo数据结构来处理按照距离由近到远的返回店铺id结合,然后查询数据库将该id对应的店铺信息查出后设置他们各自的距离后返回给前端文章来源地址https://www.toymoban.com/news/detail-468068.html

2、代码实现

List<Shop> test(Integer typeId, Integer page, Integer size, Double x, Double y) {
        // 参数中  typeId为类型id   page当前页数   size每页数据量  x经度  y维度
        // 首先判断是否需要根据坐标查询:判断客户端是否传回用户的地理位置
        if (x == null || y == null) {
            // 不需要按照地理位置查询,则进行正常分页查询
            // TODO:调用mapper层查询数据库
            return null;
        }
        
        // 2.计算分页参数
        int from = (page - 1) * size;
        int end = page * size;
        
        // 3.查询redis 根据距离排序
        String key = "shop:geo:" + typeId;
        GeoResults<RedisGeoCommands.GeoLocation<String>> search = stringRedisTemplate.opsForGeo()
                .search(
                    key,                            // key 
                    GeoReference.fromCoordinate(new Point(x, y)),  // 中心点的经纬度
                    new Distance(5000),                     // 查询范围单位默认是m
                    RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance().limit(end) // 将距离返回查询到end
        );
        if (search == null) return null;

        // 4.截取需要的数据
        List<GeoResult<RedisGeoCommands.GeoLocation<String>>> content = search.getContent();
        if (content.size() < from) {
            // 没有下一页了
            return null;
        }
        List<Long> ids = new ArrayList<>(content.size());                   // 存储用户id
        Map<String,Distance> distanceMap = new HashMap<>(content.size());   // 存储距离
        // 截取相应的部分
        content.stream().skip(from).forEach(re -> {
            // 获取id
            String shopIdStr = re.getContent().getName();
            ids.add(Long.valueOf(shopIdStr));
            // 获取距离
            Distance distance = re.getDistance();
            distanceMap.put(shopIdStr,distance);
        });
        
        // 根据id去查询对应的店铺
        List<Shop> dbShops = shopMapper.queryById(ids);
        // 将对应的距离赋值给每个shop对象后返回
        for (Shop shop:dbShops) {
            shop.setDistance(distanceMap.get(shop.getId().toString()).getValue());
        }
        
        return dbShops;
    }

到了这里,关于【Redis】GEO数据类型之附近的店铺实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis GEO 类型与 API 结合,地理位置优化的绝佳实践

    🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏:MySQL、Redis、业务设计 🤔 我当前正在学习微服务领域、云原生领域、消息中间件等架构、原理知识 💬 向我

    2024年02月08日
    浏览(26)
  • 如何使用Redis实现附近商家查询

    🔥🔥宏夏Coding网站,致力于为编程学习者、互联网求职者提供最需要的内容!网站内容包括求职秘籍,葵花宝典(学习笔记),资源推荐等内容。在线阅读:https://hongxiac.com🔥🔥 在日常生活中,我们经常能看见查询附近商家的功能。 常见的场景有,比如你在点外卖的时候

    2024年02月12日
    浏览(29)
  • java实战:Redis实现查找附近的人

    本文将介绍如何使用Redis实现查找附近的人的功能。我们将探讨如何使用Redis的地理空间(Geospatial)索引功能,并展示一个简单的Java代码示例,该示例使用Jedis库和Redis的GEOADD命令来添加位置信息,以及使用GEORADIUS命令来查找附近的人。通过本文,可以了解到如何在Java应用程

    2024年02月21日
    浏览(27)
  • Redis Geo:掌握地理空间数据的艺术

    欢迎来到我的博客,代码的世界里,每一行都是一个故事 在移动互联网和物联网的时代,地理位置数据无处不在。从导航和配送到社交网络和广告,地理位置信息正在重新定义我们与世界的互动方式。但是,处理和分析这些大量的地理空间数据绝非易事。这时,Redis Geo应运而

    2024年02月02日
    浏览(28)
  • redis7高级篇3 数据量亿级别的统计分析(hyperloglog,bitmap,geo)

    1.聚合统计:统计多个集合聚合的结果,也就是多个集合之间交并差的统计。 2.排序统计:在需要展示最新列表,排行榜等场景时,如果数据更新频繁或者需要分页时,建议使用zset127.0.0.1:6379 zadd pl  111222 beijing 111223 tianjing 111333 shanghai (integer) 3 127.0.0.1:6379 zrange pl 0 1 1) \\\"beijin

    2024年02月11日
    浏览(33)
  • 「Redis」1. 数据类型的底层实现

    前言:在这篇博文中,我们将简单总结在面试中怎么回答Redis数据类型的底层实现。 因为面试时间就那么点,言简意赅的描述自己会的知识显得尤为重要‼️ 🚀 作者简介:作为某云服务提供商的后端开发人员,我将在这里与大家简要分享一些实用的开发小技巧。在我的职业

    2024年02月10日
    浏览(25)
  • Redis - 附近商铺、用户签到、UV统计

    底层都是基于地理坐标进行搜索,支持地理坐标的技术有很多,Redis就是其中之一 GEO 就是Geolocation的简写形式,代表 地理坐标 。 Redis 在3.2版本中加入了对GEO的支持, 允许存储地理坐标信息 ,帮助我们根据经纬度来检索数据。 常见的命令有 : GEOADD :添加一个地理空间信息,

    2024年02月13日
    浏览(27)
  • Elasticsearch集群搭建、数据分片以及位置坐标实现附近的人搜索

    es使用两种不同的方式来发现对方: 广播 单播 也可以同时使用两者,但默认的广播,单播需要已知节点列表来完成 当es实例启动的时候,它发送了广播的ping请求到地址 224.2.2.4:54328 。而其他的es实例使用同样的集群名称响应了这个请求。 一般这个默认的集群名称就是上面的

    2024年02月06日
    浏览(38)
  • Redis GEO功能详细介绍与实战

    Redis的Geo功能主要用于存储地理位置信息,并对其进行操作。该功能在Redis 3.2版本新增。Redis Geo操作方法包括: geoadd:添加地理位置的坐标; geopos:获取地理位置的坐标; geodist:计算两个位置之间的距离; georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集

    2024年02月07日
    浏览(26)
  • Redis GEO地理位置信息的应用

    Redis的GEO操作是一种基于地理位置信息进行操作的功能。它使用经度和纬度坐标来表示地理位置,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。 1.GEOADD添加位置信息 将一个或多个指定的地理位置(经度、纬度、名称)添加到指定的键

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包