Redis GEO 常用 RedisTemplate API(Java)

package com.um.my_demo;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.geo.*;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyDemoApplicationTests {

    @Autowired
    RedisTemplate redisTemplate;

    /**
     *  将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。
     */
    @Test
    public void redisTestAdd() {
//        Long addedNum = redisTemplate.opsForGeo().add("geo", new Point(116.405285, 39.904989), "北京");
//        Long addedNum = redisTemplate.opsForGeo().add("geo", new Point(121.47, 31.23), "上海");
//        Long addedNum = redisTemplate.opsForGeo().add("geo", new Point(113.27, 23.13), "广州");
        Long addedNum = redisTemplate.opsForGeo().add("geo", new Point(114.05, 22.55), "深圳");//params: key, Point(经度, 纬度), 地方名称
        System.out.println(addedNum);
    }

    /**
     *  从key里返回所有给定位置元素的位置(经度和纬度)。
     */
    @Test
    public void redisTestGeoGet() {
        List<Point> points = redisTemplate.opsForGeo().position("geo","北京","上海","深圳","广州");//params: key, 地方名称...
        System.out.println(points);
    }
    //return: [Point [x=116.405283, y=39.904988], Point [x=121.470002, y=31.229999], Point [x=114.049998, y=22.550001], Point [x=113.270001, y=23.130001]]

    /**
     *  返回两个给定位置之间的距离。
     */
    @Test
    public void testDist(){
        Distance distance = redisTemplate.opsForGeo()
                .distance("geo","北京","上海", RedisGeoCommands.DistanceUnit.KILOMETERS);//params: key, 地方名称1, 地方名称2, 距离单位
        System.out.println(distance);
    }
    //return: 1067.6692 KILOMETERS

    /**
     *  以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素,并给出所有位置元素与中心的平均距离。
     */
    @Test
    public void redisTestNearByXY(){
        Circle circle = new Circle(new Point(114.05, 22.55), new Distance(200, Metrics.KILOMETERS));//Point(经度, 纬度) Distance(距离量, 距离单位)
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(5);
        GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo()
                .radius("geo",circle,args);//params: key, Circle, GeoRadiusCommandArgs
        System.out.println(results);
    }
    //return: GeoResults: [averageDistance: 51.367149999999995 KILOMETERS, results: GeoResult [content: RedisGeoCommands.GeoLocation(name=深圳, point=Point [x=114.049998, y=22.550001]), distance: 3.0E-4 KILOMETERS, ],GeoResult [content: RedisGeoCommands.GeoLocation(name=广州, point=Point [x=113.270001, y=23.130001]), distance: 102.734 KILOMETERS, ]]

    /**
     *  以给定的城市为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素,并给出所有位置元素与中心的平均距离。
     */
    @Test
    public void testNearByPlace(){
        Distance distance = new Distance(200,Metrics.KILOMETERS);//params: 距离量, 距离单位
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(5);
        GeoResults<RedisGeoCommands.GeoLocation<String>>  results = redisTemplate.opsForGeo()
                .radius("geo","深圳",distance,args);//params: key, 地方名称, Circle, GeoRadiusCommandArgs
        System.out.println(results);
    }
    //return: GeoResults: [averageDistance: 51.36685 KILOMETERS, results: GeoResult [content: RedisGeoCommands.GeoLocation(name=深圳, point=Point [x=114.049998, y=22.550001]), distance: 0.0 KILOMETERS, ],GeoResult [content: RedisGeoCommands.GeoLocation(name=广州, point=Point [x=113.270001, y=23.130001]), distance: 102.7337 KILOMETERS, ]]

    /**
     *  返回一个或多个位置元素的 Geohash 表示
     */
    @Test
    public void testGeoHash(){
        List<String> results = redisTemplate.opsForGeo()
                .hash("geo","北京","上海","深圳","广州");//params: key, 地方名称...
        System.out.println(results);
    }
    //return: [wx4g0b7xrt0, wtw3sj5zbj0, ws10730em80, ws0e9d8wn20]

}

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RedisTemplate是Spring Data Redis提供的一个Redis客户端操作工具类,封装了Redis的基本操作方法,支持多种数据类型的操作,包括字符串、哈希、列表、集合、有序集合等。 RedisGEO命令是用来处理地理位置数据的命令,可以实现以下功能: - 将给定的地理空间位置(经度、纬度、名称)添加到指定的key中。 - 获取指定地理位置的经度和纬度。 - 获取两个地理位置之间的距离。 - 根据用户给定的地理位置坐标获取指定范围内的地理位置集合。 - 获取指定地理位置周围的地理位置集合。 下面是一个基于RedisTemplateRedis GEO工具类的示例: ```java @Component public class RedisGeoUtil { @Autowired private RedisTemplate<String, Object> redisTemplate; /** * 将给定的地理空间位置(经度、纬度、名称)添加到指定的key中 * @param key 键名 * @param longitude 经度 * @param latitude 纬度 * @param member 成员名称 * @return 添加的成员数量 */ public Long geoAdd(String key, double longitude, double latitude, Object member) { Point point = new Point(longitude, latitude); return redisTemplate.opsForGeo().add(key, point, member); } /** * 获取指定地理位置的经度和纬度 * @param key 键名 * @param member 成员名称 * @return 经纬度信息 */ public Point geoGet(String key, Object member) { return redisTemplate.opsForGeo().position(key, member); } /** * 获取两个地理位置之间的距离 * @param key 键名 * @param member1 成员1名称 * @param member2 成员2名称 * @param metric 单位(默认为米,也可以是千米、英里等) * @return 两个地理位置之间的距离 */ public Distance geoDistance(String key, Object member1, Object member2, Metric metric) { return redisTemplate.opsForGeo().distance(key, member1, member2, metric); } /** * 根据用户给定的地理位置坐标获取指定范围内的地理位置集合 * @param key 键名 * @param longitude 经度 * @param latitude 纬度 * @param radius 范围 * @param unit 单位 * @return 附近的成员列表 */ public GeoResults<RedisGeoCommands.GeoLocation<Object>> geoRadius(String key, double longitude, double latitude, double radius, RedisGeoCommands.DistanceUnit unit) { Point point = new Point(longitude, latitude); Circle circle = new Circle(point, new Distance(radius, unit)); RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs .newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending(); return redisTemplate.opsForGeo().radius(key, circle, args); } /** * 获取指定地理位置周围的地理位置集合 * @param key 键名 * @param member 成员名称 * @param radius 范围 * @param unit 单位 * @return 附近的成员列表 */ public GeoResults<RedisGeoCommands.GeoLocation<Object>> geoNearByMember(String key, Object member, double radius, RedisGeoCommands.DistanceUnit unit) { RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs .newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending(); return redisTemplate.opsForGeo().radius(key, member, new Distance(radius, unit), args); } } ``` 上述工具类中的方法分别对应了Redis GEO命令中的各个功能,使用起来非常方便。需要注意的是,在使用Redis GEO命令时,需要Redis版本2.8.9以上的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值