服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - 使用redis实现附近的人功能

使用redis实现附近的人功能

2021-11-17 17:44Java是最好的语言√ Redis

这篇文章主要介绍了使用redis实现附近的人,实现诸如附近的人这类依赖于地理位置信息的功能,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下

前言

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

使用redis实现附近的人功能

工具

百度经纬度拾取器

拾取坐标系统

一、测试数据

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

二、基本命令

1. geoadd

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

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

查看已添加集合

使用redis实现附近的人功能

2.geopos

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

?
1
2
geopos 集合名称 位置 [name...]
geopos address wuyue

查看坐标信息

使用redis实现附近的人功能

3.geodist

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

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

使用redis实现附近的人功能

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

m :表示米

km:表示千米

mi:表示英里

ft:表示英尺。

4.georadius

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

?
1
2
3
georadius 集合名称 精度 纬度 radius m|km|ft|mi| [withcoord] [withdist] [asc|desc] [count count]
//查询据我100km之内的城市
georadius citys 120.754274 27.983296 100 km

使用redis实现附近的人功能

radius:距离

withcoord:返回坐标

由于版本原因可能为空

withdist:同时返回距离

使用redis实现附近的人功能

asc|desc:排序

使用redis实现附近的人功能

count:取多少长度

使用redis实现附近的人功能

5. georadiusbymember

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

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

使用redis实现附近的人功能

三、javaapi

实体类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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.75427427.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);
        }
    }
}

到此这篇关于使用redis实现附近的人的文章就介绍到这了,更多相关redis实现附近的人内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_37612049/article/details/120334313

延伸 · 阅读

精彩推荐
  • RedisRedis存取序列化与反序列化性能问题详解

    Redis存取序列化与反序列化性能问题详解

    这篇文章主要给大家介绍了关于Redis存取序列化与反序列化性能问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    这名字已经存在9742021-02-24
  • RedisLinux Redis 的安装步骤详解

    Linux Redis 的安装步骤详解

    这篇文章主要介绍了 Linux Redis 的安装步骤详解的相关资料,希望大家通过本文能掌握如何安装Redis,需要的朋友可以参考下 ...

    carl-zhao3822019-11-08
  • Redis聊一聊Redis与MySQL双写一致性如何保证

    聊一聊Redis与MySQL双写一致性如何保证

    一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。本文给大家分享Redis与MySQL双写一致性该如何保证,感兴趣的朋友一...

    mind_programmonkey6432021-08-12
  • RedisRedis分布式锁升级版RedLock及SpringBoot实现方法

    Redis分布式锁升级版RedLock及SpringBoot实现方法

    这篇文章主要介绍了Redis分布式锁升级版RedLock及SpringBoot实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以...

    等不到的口琴7802021-07-25
  • RedisRedis数据结构之链表与字典的使用

    Redis数据结构之链表与字典的使用

    这篇文章主要介绍了Redis数据结构之链表与字典的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    白泽来了4052021-08-03
  • Redis在ssm项目中使用redis缓存查询数据的方法

    在ssm项目中使用redis缓存查询数据的方法

    本文主要简单的使用Java代码进行redis缓存,即在查询的时候先在service层从redis缓存中获取数据。如果大家对在ssm项目中使用redis缓存查询数据的相关知识感...

    caychen8962019-11-12
  • Redis就这?Redis持久化策略——AOF

    就这?Redis持久化策略——AOF

    今天为大家介绍Redis的另一种持久化策略——AOF。注意:AOF文件只会记录Redis的写操作命令,因为读命令对数据的恢复没有任何意义...

    头发茂密的刘叔4052021-12-14
  • Redisredis启动,停止,及端口占用处理方法

    redis启动,停止,及端口占用处理方法

    今天小编就为大家分享一篇redis启动,停止,及端口占用处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    澄海单挑狂5152019-11-14