广告位联系
返回顶部
分享到

使用redis实现附近的人功能的介绍

Redis 来源:转载 作者:秩名 发布时间:2021-09-19 09:29:43 人浏览
摘要

edis自3.2版本开始提供了GEO(geograph)功能,支持地理位置相关操作,以实现诸如附近的人这类依赖于地理位置信息的功能。 工具 百度经纬度拾取器 拾取坐标系统 一、测试数据 120.70012 28.00135 温州 120.207686 30.253359 杭州 121.482537 31.238034 上海 1

edis自3.2版本开始提供了GEO(geograph)功能,支持地理位置相关操作,以实现诸如附近的人这类依赖于地理位置信息的功能。



工具

百度经纬度拾取器



一、测试数据

120.70012 28.00135 温州
120.207686 30.253359 杭州
121.482537 31.238034 上海
118.793117 32.068407 南京

二、基本命令

1. geoadd

为了进行地理位置相关操作,我们首先需要将具体的地理位置记录起来,可以通过执行geoadd 命令来完成 命令格式如下

GEOADD 集合名称 经度 纬度 名称 [longitude latitude name...]
//添加集合
geoadd citys 120.70012 28.00135 wenzhou 120.207686 30.253359 hanghzou

查看已添加集合

2.geopos

此命令根据输入的位置名称获取位置的信息坐标,语法如下

GEOPOS 集合名称 位置 [name...]
geopos address wuyue

查看坐标信息

3.geodist

此命令用于计算两个位置之间的距离,语法如下

geodist 集合名称 位置1 位置2 [unit]
//计算杭州到南京之间的距离
geodist citys hanghzredis:0>ou nanjing km

可选参数:unit用于指定计算距离时的单位,他的值可以是以下单位的其中一个

m :表示米

km:表示千米

mi:表示英里

ft:表示英尺。

4.georadius

georadius使用用户给定的经纬度作为计算范围时的中心点,

georadius 集合名称 精度 纬度 radius m|km|ft|mi| [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]
//查询据我100km之内的城市
georadius citys 120.754274 27.983296 100 km

radius:距离

WITHCOORD:返回坐标

由于版本原因可能为空

WITHDIST:同时返回距离

ASC|DESC:排序

count:取多少长度

5. georadiusbymember

georadiusbymember使用存储在位置集合里的某个地点作为中心点

georadiusbymember 地址集合 地点名称 距离 单位
//查询距离wuyue五公里之内的地点
georadiusbymember address wuyue 5 km



三、javaApi

实体类

 
package com.jiale.web.controller.pojo;
 
import lombok.Data;
 
import java.io.Serializable;
 
/**
 * @Author: Hello World
 * @Date: 2021/9/16 16:12
 * @Description:
 */
@Data
public class AddressInfo implements Serializable {
 
    /**网点名称*/
    private String title;
    /**网点地址*/
    private String address;
    /**网点联系方式*/
    private String phone;
    /**网点坐标-精度*/
    private double x;
    /**网点坐标-纬度*/
    private double y;
}
package com.jiale;
 
import com.jiale.common.config.JialeGlobal;
import com.jiale.web.controller.pojo.AddressInfo;
import org.junit.jupiter.api.Test;
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.web.bind.annotation.RequestMapping;
 
import java.math.BigDecimal;
import java.util.List;
 
 
/**
 * @Author: Hello World
 * @Date: 2021/9/15 17:47
 * @Description:
 */
@SpringBootTest
public class JialeTests {
 
    @Autowired
    RedisTemplate redisTemplate;
 
   @Test
    public void test1(){
        System.out.println(JialeGlobal.getUploadPath());
    }
 
    /**
     * 一.向redis中添加位置信息
     * 1.网店位置信息-geo
     * 2.网点详细信息
     */
    @Test
    public void geoAdd(){
        //1.网点位置信息存储120.653208,28.032606
        Point point = new Point(120.653208, 28.032606);
        redisTemplate.boundGeoOps("outlets").add(point,"江心屿");
        //2.网点详细信息
        AddressInfo addressInfo = new AddressInfo();
        addressInfo.setTitle("江心屿");
        addressInfo.setAddress("浙江省温州市鹿城区江心屿景区内");
        addressInfo.setPhone("(0577)88201281");
        addressInfo.setX(120.653208);
        addressInfo.setY(28.032606);
        redisTemplate.boundHashOps("outletsInfo").put("江心屿",addressInfo);
    }
 
    /**
     * 二.获取位置坐标信息
     */
    @Test
    public  void geoPos(){
        //传入位置名称查询位置信息
        List<Point> position = redisTemplate.boundGeoOps("outlets").position("南塘五组团");
        for (Point point : position) {
            System.out.println(point);
        }
    }
 
    /**
     * 三.计算两个位置信息
     */
    @Test
    public void geoDist(){
        /**
        Distance distance = redisTemplate.boundGeoOps("outlets").distance("江心屿", "温州乐园");
        //距离
        double value = distance.getValue();
        //单位
        String unit = distance.getUnit();
        System.out.println("两点相距:"+value+unit);
         */
        //以km展示
        /**
        Distance distance = redisTemplate.boundGeoOps("outlets").distance("江心屿", "温州乐园", Metrics.KILOMETERS);
        //距离
        double value = distance.getValue();
        //单位
        String unit = distance.getUnit();
        System.out.println("两点相距:"+value+unit);*/
 
        //保留两位小数
        Distance distance = redisTemplate.boundGeoOps("outlets").distance("江心屿", "温州乐园", Metrics.KILOMETERS);
        //距离
        double value = distance.getValue();
        //单位
        String unit = distance.getUnit();
        System.out.println("两点相距:"+new BigDecimal(value).setScale(2,BigDecimal.ROUND_HALF_UP) +unit);
    }
 
    /**
     * 四.按照给定的经纬度查找指定范围的位置
     */
    @Test
    public  void geoRadius(){
        //指定位置
        Point point = new Point(120.754274,  27.983296);
        //构建条件-10km
        Distance distance = new Distance(10, Metrics.KILOMETERS);
        Circle circle = new Circle(point,distance);
        //RedisGeoCommands
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
         //包含位置信息
        args.includeDistance();
 
        //存放的是查询到的网址位置信息
        GeoResults<RedisGeoCommands.GeoLocation<String>> outlets = redisTemplate.boundGeoOps("outlets").radius(circle, args);
        for (GeoResult<RedisGeoCommands.GeoLocation<String>> outlet : outlets) {
            //获取距离信息
            Distance outletDistance = outlet.getDistance();
            //距离
            double value = outletDistance.getValue();
            //单位
            String unit = outletDistance.getUnit();
            System.out.println("当前坐标距离:"+outlet.getContent().getName()+value+unit);
        }
    }
 
    /**
     * 五.按照指定元素(必须在集合中存在)查找指定范围位置
     */
    @Test
    public void geoRadiusByMember(){
        //构建条件
        Distance distance = new Distance(10, Metrics.KILOMETERS);
        //构建条件-包含位置信息
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
        args.includeDistance();
        //参数  key   构建的条件  其他条件
        GeoResults<RedisGeoCommands.GeoLocation<String>> outlets = redisTemplate.boundGeoOps("outlets").radius("江心屿", distance,args);
        for (GeoResult<RedisGeoCommands.GeoLocation<String>> outlet : outlets) {
            //获取距离信息
            Distance outletDistance = outlet.getDistance();
            //距离
            double value = outletDistance.getValue();
            //单位
            String unit = outletDistance.getUnit();
            System.out.println("江心屿距离:"+outlet.getContent().getName()+value+unit);
        }
    }
}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/qq_37612049/article/details/120334313
相关文章
  • spring boot集成redis基础入门实例介绍
    redis 支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储。 可以进行master-slave模式的数据备份 更多
  • redis批量操作pipeline管道操作方法

    redis批量操作pipeline管道操作方法
    redis | pipeline(管道) 背景 Redis是一种基于客户端-服务端模型以及请求/响应的TCP服务。这意味着通常情况下一个请求会遵循以下步骤: 客户
  • springboot整合使用云服务器上的Redis方法

    springboot整合使用云服务器上的Redis方法
    一、前提条件 修改redis.conf配置文件 1、protected-mode yes(默认的) 修改成 protected-mode no,解除保护模式 2、注释掉绑定ip ,绑定ip的话,使得
  • 阿里云服务器部署Redis并整合Spring Boot的介绍

    阿里云服务器部署Redis并整合Spring Boot的介绍
    一、什么是Redis redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zs
  • 生产redisson延时队列不消费问题排查解决

    生产redisson延时队列不消费问题排查解决
    问题描述 项目使用redisson延时队列功能,实现直播的开播提醒,突然有一天业务爆出问题,未触发开播提醒。 初步排查 首先通过查询生产日
  • Redis主从复制分步讲解使用

    Redis主从复制分步讲解使用
    主服务器(master)启用二进制日志 选择一个唯一的server-id 创建具有复制权限的用户 从服务器(slave)启用中继日志, 选择一个唯一的serv
  • Redis中HyperLogLog的使用介绍
    HyperLogLog,基数统计; 那什么是基数? 比如有两个数组 数组A = [1,2,3,4,5]; 数组B = [3,4,5,6,7]; 这时候基数就是[1,2,3,4,5,6,7],总共有7个数; 就是
  • Redis中的持久化介绍

    Redis中的持久化介绍
    1. 前言 为什么要进行持久化?:持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据
  • Redis源码设计剖析之事件处理示例介绍

    Redis源码设计剖析之事件处理示例介绍
    1. Redis事件介绍 Redis服务器是一个 事件驱动程序 ,所谓事件驱动就是输入一条命令并且按下回车,然后消息被组装成 Redis 协议的格式发送给
  • Mysql应用安装后找不到my.ini文件的解决过程

    Mysql应用安装后找不到my.ini文件的解决过程
    一、背景 我在两台电脑上安装了MySQL Server 8.0,准备继续做主从配置,这时候就需要用到my.ini文件进行配置,但是我找不到my.ini文件。 我的
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计