码迷,mamicode.com
首页 > 其他好文 > 详细

Redis geo

时间:2021-04-24 13:37:44      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:接受   family   自己   关于   ops   必须   概念   long   metrics   

一般常用的地方:

  当我们的做需求的时候会有这样的需求,如当我们需要做位置定位,或者我们需要知道当前所在位置坐标(经度,维度,位置名字),或者去寻找多少米内的建筑位置  或者是建筑个数,这个我们可以利用redis的GEO地理定位计算可以得出,数据库中存放商家的经纬度(坐标),通过geo计算得出距离。

关于 Redis Geo介绍

  • 1、Redis 的 Geo 是在 3.2 版本才有的
  • 2、使用 geohash 保存地理位置的坐标
  • 3、使用有序集合(zset)保存地理位置的集合

3.1 GEOADD概念 

GEOADD 命令以标准的 x,y 格式接受参数 ,所以用户必须先输入经度, 然后再输入纬度。 GEOADD能够记录的坐标是有限的: 非常接近两极的区域是无法被索引的。 

  • 有效的经度介于 -180 度至 180 度之间。

  • 有效的纬度介于 -85.05112878 度至 85.05112878 度之间。

当用户尝试输入一个超出范围的经度或者纬度时, GEOADD 命令将返回一个错误。

 /***
     * 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。
     * @param key redis的key
     * @param precision   经度
     * @param dimension   纬度
     * @param name  名称
     * @return
     */                                       name可根据自己需求变更为相应的类型
    public Long redisGeoAdd(String key, double precision, double dimension, String name) {
        Long addedNum = redisTemplate.opsForGeo().add(key, new Point(precision, dimension), name);
        //params: key, Point(经度, 纬度), 地方名称
        return addedNum;
    }

 

 

3.2 GEOPOST概念

 GEOPOS 命令接受可变数量的位置元素作为输入, 所以即使用户只给定了一个位置元素, 命令也会返回数组回复。

/***
     * 从key里返回所有给定位置元素的位置(经度和纬度)。
     * @param key redis的key
     * @param nameList  名称的集合
     */
    public List redisGeoGet(String key, String nameList) {
        List points =  redisTemplate.opsForGeo().geoPos(key, nameList);//params: key, 地方名称...
        //List points =  redisTemplate.opsForGeo().position(key, nameList);//params: key, 地方名称...
        return points;
    }

 

 

3.3GEODIST概念

GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。 返回两个给定位置之间的距离

 /***
     * 返回两个给定位置之间的距离。
     * @param key redis的key
     * @param name1 地方名称1
     * @param name2 地方名称2
     * @return
     */
    public Distance geoDist(String key, String name1, String name2) {
        Distance distance = redisTemplate.opsForGeo()
                .distance(key, name1, name2, RedisGeoCommands.DistanceUnit.KILOMETERS);
           //params: key, 地方名称1, 地方名称2, 距离单位 return distance; }

 

3.3 REDISDIUS概念

REDISDIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT <count> 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。

/***
     * 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素,并给出所有位置元素与中心的平均距离。
     * @param key redis的key
     * @param precision 经度
     * @param dimension 纬度
     * @param distance 距离
     * @param count 人数
     * @return
     */
    public GeoResults<RedisGeoCommands.GeoLocation<String>> redisNearByXY(String key, double precision, double dimension, Integer distance, Integer count) {
        //Point(经度, 纬度) Distance(距离量, 距离单位)
        GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo().radius(
                        key,
                        new Circle(new Point(precision, dimension), new Distance(distance, Metrics.KILOMETERS)),
                        RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(count));
        return results;
    }    

 

3.4 GEORADIUSBYMEMBER 概念

这个命令和 GEORADIUS(REDISDIUS) 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点。

 /**
     * 
     * @param key KEY
     * @param precision  地区名
     * @param distance   距离
     * @return true
     */
    public GeoResults redisGeoMember(String key,String precision, Integer distance){
        GeoResults geoResults = redisTemplate.opsForGeo().geoRadiusByMember(key, precision, distance);
        return geoResults;
    }

3.5 GEOHASH 概念

 返回一个或多个位置元素的 GEOHASH 表示 命令返回的 GEOHASH 的位置与用户给定的位置元素的位置一一对应。

 

/***
     * 返回一个或多个位置元素的 Geohash 表示
     * @param key redis的key
     * @param nameList  名称的集合
     */
    public List<String> geoHash(String key, String nameList) {
        //params: key, 地方名称...
        List<String> results = redisTemplate.opsForGeo().hash(key, nameList);
        return results;
    }

 

Redis geo

标签:接受   family   自己   关于   ops   必须   概念   long   metrics   

原文地址:https://www.cnblogs.com/YLSF/p/14695548.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!