前言

现在是移动互联网的时代,几乎人手一个手机,而手机可以很轻松的获取到用户的定位信息,也就是经纬度。而交友APP的基础就是经纬度,它的核心功能一个是寻找附近的人,一个是查看对方与你的直线距离,而这些功能,用redis的新数据类型GEO可以很方便的实现。

GEO

常用命令

存储地址空间位置

geoadd key longitude latitude member

返回两个位置间的距离

geodist key member1 member2 [m|km]

返回指定元素周边的元素

georadiusbymember key member radius m|km

案例

好了,命令讲完了,直接上代码,毕竟,talk is cheap, show me the code!  (*^▽^*)

public class GeoController extends BaseController {@Autowiredprivate RedisTemplate redisTemplate;@PostMapping@ApiOperation(value = "手机上线,报告经纬度")public Result online(String name, double longitude, double latitude) {redisTemplate.opsForGeo().add("geo", new Point(longitude, latitude), name);return resultOk();}@GetMapping@ApiOperation(value = "获取成员经纬度")public Result<Point> online(String name) {List<Point> points = redisTemplate.opsForGeo().position("geo", name);if (CollectionUtil.isEmpty(points)) {return resultOk();}return resultOk(points.get(0));}@GetMapping(value = "/geodist")@ApiOperation(value = "获取成员间距离")public Result geodist(String member1, String member2) {//获取两个成员间距离,单位kmDistance distance = this.redisTemplate.opsForGeo().distance("geo", member1, member2, RedisGeoCommands.DistanceUnit.KILOMETERS);return resultOk(distance);}@GetMapping(value = "/georadiusByMember")@ApiOperation(value = "获取成员附近的人")public Result<GeoResults> radiusByMember(String member) {//返回结果按距离升序,包含距离和经纬度, 返回50条RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(50);//半径10公里内Distance distance = new Distance(10, Metrics.KILOMETERS);GeoResults<RedisGeoCommands.GeoLocation<String>> geoResults = this.redisTemplate.opsForGeo().radius("geo", member, distance, args);return resultOk(geoResults);}@GetMapping(value = "/georadius")@ApiOperation(value = "获取指定经纬度附近的人")public Result<GeoResults> georadius(double longitude, double latitude) {//半径10公里内Distance distance = new Distance(10, Metrics.KILOMETERS);//根据经纬度生成范围Circle circle = new Circle(new Point(longitude, latitude), distance);//返回结果按距离升序,包含距离和经纬度, 返回50条RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(50);GeoResults<RedisGeoCommands.GeoLocation<String>> geoResults = this.redisTemplate.opsForGeo().radius("geo", circle, args);return resultOk(geoResults);}
}

演示

获取小张和小美间的距离,可以看到小张和小美之间只有200M

查看小张附近的人,可以看到小张附近有小美和小爱

参考项目(模块: SpringBoot-HelloWorld): https://gitee.com/huatin/java-test

SpringBoot进阶-寻找附近的人,Redis实现交友APP(七)相关推荐

  1. springboot controller 分页查询_Spring Boot实战分页查询附近的人: Redis+GeoHash+Lua

    您的支持是我不断创作巨大动力 CSDN博客地址(关注,点赞) 人工智能推荐 GitHub(Star,Fork,Watch) 前言 最近在做社交的业务,用户进入首页后需要查询附近的人: 项目状况:前期尝 ...

  2. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)...

    SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 前言 表结构 maven配置 配置Druid 配置mybatis ...

  3. Redis进阶实践之十六 Redis大批量增加数据

    原文:Redis进阶实践之十六 Redis大批量增加数据 一.介绍 有时候,Redis实例需要在很短的时间内加载大量先前存在或用户生成的数据,以便尽可能快地创建数百万个键.这就是所谓的批量插入,本文档 ...

  4. springboot+jwt+shiro+vue+elementUI+axios+redis+mysql完成一个前后端分离的博客项目(笔记,帮填坑)

    根据B站up主MarkerHub视频制作的一个笔记 我的博客 B站博主链接: https://www.bilibili.com/video/BV1PQ4y1P7hZ?p=1 博主的开发文档: http ...

  5. spring-boot的spring-cache中的扩展redis缓存的ttl和key名

    原文地址:spring-boot的spring-cache中的扩展redis缓存的ttl和key名 前提 spring-cache大家都用过,其中使用redis-cache大家也用过,至于如何使用怎么 ...

  6. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例...

    SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 1.前言 本文主要介绍使用SpringBoot与shiro实现基 ...

  7. SpringBoot进阶教程 | 第四篇:整合Mybatis实现多数据源

    这篇文章主要介绍,通过Spring Boot整合Mybatis后如何实现在一个工程中实现多数据源.同时可实现读写分离. 准备工作 环境: windows jdk 8 maven 3.0 IDEA 创建 ...

  8. SpringBoot系统搭建集成-007-集成Redis

    Lison <cundream@163.com>, v1.0.0, 2019.10.13 SpringBoot系统搭建集成-007-集成Redis 一. 直接导入Redis的依赖 < ...

  9. SpringBoot进阶-日志等级配置与操作

    SpringBoot进阶-日志等级配置与操作 一.日志等级 二.设置日志等级 三.打印日志 四.自定义日志格式 五.文件记录日志 一.日志等级 trace:最低等级 debug:调试用,通常用于跟踪程 ...

  10. SpringBoot进阶教程 | 第四篇:整合Mybatis实现多数据源 1

    这篇文章主要介绍,通过Spring Boot整合Mybatis后如何实现在一个工程中实现多数据源.同时可实现读写分离. 准备工作 环境: windows jdk 8 maven 3.0 IDEA 创建 ...

最新文章

  1. PyTorch之前向传播函数自动调用forward
  2. “No operations defined in spec!”一文教你swagger如何扫描多个controller
  3. web项目的创建和发布
  4. Linux Deepin 版本大全,Deepin下载-Deepin linuxv20.0 官方版下载-6188手游网
  5. 被人推荐频率最高的书Top10
  6. 回顾一下Unix哲学
  7. ARM Cortex-M0(1)---浅谈ARM Cortex-M0
  8. python中函数用法教程_Python中zip()函数用法实例教程
  9. fiddler限速_fiddler限制网速
  10. spring5.0之后Log4jConfigListener过期问题
  11. c语言窗体编辑框框函数,请教:下面c语言是创建口的小程序,函数MessageBox(NULL,,,,MB_OK);中的4个参数各起什么作用?...
  12. ALM / QC 64-bit Patch 12 S-Chinese
  13. java web 开发资料链接
  14. Vue学习之Vant图标使用及问题
  15. 整体大于部分_Redis典型应用场景实战之抢红包系统整体业务流程分析赠书
  16. 【基础语法篇】Java必备基础(思维导图+代码)
  17. 多种方法教你 Docx怎么转换成Doc
  18. MYSQL- DQL
  19. 计算机各个接口PCB-Layout 规则要求
  20. 调速阀------电磁阀

热门文章

  1. CCS编译错误:error #10099-D和error#10234-D unresolved symbols remain解决方法
  2. python画正弦函数_python中怎么用matlibplot画正弦曲线
  3. linux 蓝牙驱动
  4. rrcf算法的初步理解
  5. 简述计算机键盘上shift键的作用,电脑Shift键作用大全
  6. springboot集成camunda
  7. Android学习日志1---在AndroidStudio启动Android 模拟器(ADV)发生的失败
  8. 通信领域的宽带信号和窄带信号到底是什么??
  9. vscode文件名颜色含义与右侧字母含义
  10. 电脑桌面计算机图标下不显示文字,电脑桌面图标下面的文字有时会突然不见,然后 – 手机爱问...