Redis 系列08--Redis GEO

上一篇:https://blog.csdn.net/fengxianaa/article/details/124390653

存储地理位置信息,并对存储的信息进行操作,可以用来查找附近的商铺,人员等。

1. 主要命令

  • geoadd:添加地理坐标,返回添加成功的元素个数
  • geopos:获取指定地点的经纬度
    • 下图,返回 北京 上海的经纬度,因为没有南京的经纬度,所以返回 nil
  • geodist:计算两个地点之间的距离,返回两点之间的距离,单位:米
    • 下图,以km为单位返回
  • georadius:给定的经纬度为中心点,获取指定范围内的地点集合
    • 这个命令在 redis 6.2 之后的版本已经废弃,使用geosearch代替
    • 天津的经纬度是:117.2,39.13,下图:查询天津周围200Km内的城市
      • 在返回地点时, 与中心之间的距离也一并返回
      • 将地点的经纬度也一并返回
      • 从近到远的方式返回
      • 也可以从远到近
  • georadiusbymember:根据集合中的某个地点,获取指定范围内的地理位置集合
    • 查询天津周围200Km内的城市
  • geosearch:在指定范围内搜索地点,范围可以是圆形或者矩形
    • 查询天津周围200Km内的城市
      • 根据经纬度
        • 根据集合中的元素

2. java

更新maven依赖

<!-- 一个较高的版本才能用到新的API -->
<parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.3.9.RELEASE</version>
  </parent>
<!-- 去除老版本的依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>lettuce-core</artifactId>
            <groupId>io.lettuce</groupId>
        </exclusion>
        <exclusion>
            <artifactId>spring-data-redis</artifactId>
            <groupId>org.springframework.data</groupId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 使用新版本 -->
<dependency>
    <artifactId>spring-data-redis</artifactId>
    <groupId>org.springframework.data</groupId>
    <version>2.6.2</version>
</dependency>
<dependency>
    <artifactId>lettuce-core</artifactId>
    <groupId>io.lettuce</groupId>
    <version>6.1.6.RELEASE</version>
</dependency>
@Test
public void testGeo(){
    // 查询天津2000km范围内的城市
    GeoResults<RedisGeoCommands.GeoLocation<String>> city =
            stringRedisTemplate.opsForGeo().search("city",
                    GeoReference.fromCoordinate(117.2, 39.13),//经纬度
                    new Distance(200, Metrics.KILOMETERS),// 范围
                    RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance());//返回距离
    List<GeoResult<RedisGeoCommands.GeoLocation<String>>> content = city.getContent();

    for(GeoResult<RedisGeoCommands.GeoLocation<String>> geo : content){
        System.out.println(geo.getContent().getName());
        System.out.println(geo.getDistance().toString());
    }
}

常用方法

@Test
public void testGeo(){
    //1. 添加元素:郑州
    stringRedisTemplate.opsForGeo().add("city", new Point(112.43, 34.16), "zhengzhou");
//      RedisGeoCommands.GeoLocation location =
//                new RedisGeoCommands.GeoLocation("zhengzhou", new Point(112.43, 34.16));
//      stringRedisTemplate.opsForGeo().add("city", location);

    //2. 获取两点距离
    Distance distance = stringRedisTemplate.opsForGeo()
            .distance("city", "tianjin", "shanghai", Metrics.KILOMETERS);
    System.out.println(distance.getNormalizedValue());

    //3. 查询
    GeoResults<RedisGeoCommands.GeoLocation<String>> result = 
        stringRedisTemplate.opsForGeo().radius("city", "tianjin",
            new Distance(20000, Metrics.KILOMETERS),
            RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance());
    
    for(GeoResult<RedisGeoCommands.GeoLocation<String>> geo : result){
        System.out.println(geo.getContent().getName());
        System.out.println(geo.getDistance().toString());
    }
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值