springboot使用redis geo获取附近门店

文章介绍了如何在Redis3.2及以上版本中使用GEOADD、GEODIST和GEORADIUS等命令处理地理空间信息,包括添加位置、计算距离和查找指定范围内的位置。在Java中,通过RedisTemplate的opsForGeo()方法进行操作。示例代码展示了如何设置和查询地理位置,并给出了按距离排序并去除圆心的解决方案。
摘要由CSDN通过智能技术生成

Redis geo 3.2版本以上才有 

在进入redis后,使用info命令获取redis版本信息

使用到的命令

  • GEOADD:添加一个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)
  • GEODIST:计算指定的两个点之间的距离并返回
  • GEORADIUS:指定圆心、半径,找到该圆内包含的所有member,并按照与圆心之间的距离排序后返回。(6.x版本废弃,有新的使用方式)

插入两个地理空间位置信息(仅示例,未加小数点存储有误差)

 

对应的java中使用的redis写法 

 /**
     * 放入地理位置
     * @param key 主键
     * @param locations 位置集合,RedisGeoCommands.GeoLocation<String>型
     */
    public void setGeoLocation(String key,List<RedisGeoCommands.GeoLocation<String>> locations) {
        redisTemplate.opsForGeo().add(key,locations);
    }

list示例 

 List<RedisGeoCommands.GeoLocation<String>> locations = new ArrayList<>();
 locations.add(new RedisGeoCommands.GeoLocation<>("test",new Point(longitude,latitude)));
 redisUtil.setGeoLocation(key,locations);

 查看地理空间位置信息

查看两地距离 

 

 查看以first为圆心附近10km内同一key值下位置信息(包含圆心)

public GeoResults<RedisGeoCommands.GeoLocation<String>> getGeoLocation(String key, Circle circle, RedisGeoCommands.GeoRadiusCommandArgs args)
    {
       return redisTemplate.opsForGeo().radius(key,circle,args);
    }
 //经纬度信息
 Point point = new Point(longitude, latitude);
//距离单位
 Metric metric = RedisGeoCommands.DistanceUnit.KILOMETERS;
//3km以内的
 Distance distance = new Distance(3, metric);
 Circle circle = new Circle(point, distance);
//        需要返回5条包括距离的
 RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands
                .GeoRadiusCommandArgs
                .newGeoRadiusArgs()
                .includeDistance()
                .sortAscending()
                .limit(5);
GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisUtil.getGeoLocation(key, circle, args);

 去除圆心,并按距离排序,我的解决方案

放在treeSet里,自定义排序,通过set的pollFirst去除第一条数据

TreeSet<MyDistance> set = new TreeSet<>((Comparator.comparingDouble(MyDistance::getDistance)));
results.forEach(geoLocationGeoResult -> {
    set.add(MyDistance);
}
set.pollFirst();

Spring Boot提供了对Redis的集成支持,可以使用Spring Data Redis来操作Redis。要在Spring Boot中使用RedisGEO功能,可以按照以下步骤进行操作: 1. 首先,确保在你的pom.xml(如果使用Maven)或build.gradle(如果使用Gradle)文件中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 在application.properties或application.yml文件中配置Redis连接信息: ```yaml spring.redis.host=your-redis-host spring.redis.port=your-redis-port ``` 3. 创建一个实体类来表示地理位置信息,可以使用Spring Data Redis提供的`@RedisHash`和`@Indexed`注解来定义实体和索引,例如: ```java @RedisHash("locations") public class Location { @Id private String id; private String name; private Point point; // 用于存储地理位置的Point对象 // 省略构造方法、Getter和Setter } ``` 4. 创建一个继承自`CrudRepository`的Repository接口,用于对地理位置实体进行CRUD操作。可以使用Spring Data Redis提供的`@GeoIndexed`注解来定义地理位置索引,例如: ```java public interface LocationRepository extends CrudRepository<Location, String> { @GeoIndexed List<Location> findByPointNear(Point point, Distance distance); } ``` 5. 在需要使用地理位置功能的地方注入`LocationRepository`,然后就可以使用该Repository进行地理位置的操作了。例如,可以使用`findByPointNear`方法查询给定地理位置附近的其他位置,例如: ```java @Autowired private LocationRepository locationRepository; public List<Location> findNearbyLocations(Point point, double distance) { Distance searchDistance = new Distance(distance, Metrics.KILOMETERS); return locationRepository.findByPointNear(point, searchDistance); } ``` 这样,你就可以在Spring Boot中使用RedisGEO功能了。注意,以上只是一个简单的示例,实际使用中可能需要根据自己的业务需求进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值