码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 基于SpringBoot+Redis实现查找附近用户的功能


    前言

    简单记录一下使用Redis的GEO命令,SpringDataRedis提供了十分简单的地理位置定位的功能,实现查找附近用户的功能。

    一、Redis的GEO命令之GEOADD、GEORADIUS命令

    1.GEOADD 命令

    (1)用法:GEOADD key [longitude][ latitude ][member]
    (2)作用:用于存储地理位置信息,以便进行地理位置搜索和距离计算等操作。
    (3)返回值:成功添加的成员数量。
    (4)示例:

    1. redis > GEOADD cities 116.4074 39.9042 Beijing
    2. redis > GEOADD cities NX 121.4737 31.2304 Shanghai

    (5)可选参数:
    - NX:只在 key 不存在时才执行操作。
    - XX:只在 key 存在时才执行操作。
    - CH:修改成功的成员数量将被返回

    2.GEORADIUS 命令

    (1)用法:GEORADIUS key longitude latitude radius
    (2)作用:用于查询指定地理位置附近的其他地理位置的命令。
    (3)返回值:返回成员列表。
    (4)示例:

    redis > GEORADIUS User-Location 116.4074 39.9042 100 km

    二、示例代码

    1.控制层

    (1)UserController.java

    1. /**
    2. * 更新用户位置信息
    3. * {
    4. * "longitude": 113.936099,
    5. * "latitude": 22.542364
    6. * }
    7. */
    8. @PostMapping("updateUserLocation")
    9. @ResponseBody
    10. @CrossOrigin
    11. public T updateUserLocation(@RequestBody HashMap data) {
    12. return userService.updateUserLocation(data);
    13. }
    14. /**
    15. * 更新用户位置信息
    16. * {
    17. * "longitude": 113.936099,
    18. * "latitude": 22.542364,
    19. * "radius": 10
    20. * }
    21. */
    22. @PostMapping("nearby")
    23. @ResponseBody
    24. @CrossOrigin
    25. public T nearby(@RequestBody HashMap data) {
    26. return userService.nearby(data);
    27. }

    2.接口层

    (1)IUserService.java

    1. T updateUserLocation(HashMap data);
    2. T nearby(HashMap data);

    3.实现层

    (1)UserServiceImpl.java

    1. @Override
    2. public T updateUserLocation(HashMap data) {
    3. HashMap responseObj = new HashMap<>();
    4. // 获取登录用户
    5. UserDTO userDTO = RequestHolder.getUser();
    6. // 获取经纬度
    7. Double longitude = (Double) data.get("longitude"); // 经度
    8. Double latitude = (Double) data.get("latitude"); // 维度
    9. String USER_LOCATION_KEY = "User-Location";
    10. String phone = userDTO.getPhone();
    11. stringRedisTemplate.opsForGeo().add(USER_LOCATION_KEY, new Point(longitude, latitude), phone);
    12. responseObj.put("code", 200);
    13. responseObj.put("success", true);
    14. responseObj.put("msg", "更新完成");
    15. return (T) responseObj;
    16. }
    17. @Override
    18. public T nearby(HashMap data) {
    19. HashMap responseObj = new HashMap<>();
    20. // 获取登录用户
    21. UserDTO userDTO = RequestHolder.getUser();
    22. // 获取经纬度,以及半径
    23. Double longitude = (Double) data.get("longitude"); // 经度
    24. Double latitude = (Double) data.get("latitude"); // 维度
    25. Integer radius = (Integer) data.get("radius"); // 半径
    26. String USER_LOCATION_KEY = "User-Location";
    27. String phone = userDTO.getPhone();
    28. Distance distance = new Distance(radius, Metrics.KILOMETERS); // 距离,单位为千米
    29. Circle circle = new Circle(new Point(longitude, latitude), distance); // 圆心
    30. // 使用Redis的地理位置操作对象,在指定范围内查询附近的用户位置信息
    31. GeoResults> geoResults = stringRedisTemplate.opsForGeo().radius(USER_LOCATION_KEY, circle);
    32. List nearbyUsers = new ArrayList<>();
    33. for (GeoResult> geoResult : geoResults.getContent()) {
    34. Object memberId = geoResult.getContent().getName();
    35. // 排除查询用户本身
    36. if (!memberId.equals(phone)) {
    37. nearbyUsers.add(memberId);
    38. }
    39. }
    40. responseObj.put("code", 200);
    41. responseObj.put("success", true);
    42. responseObj.put("msg", "更新完成");
    43. responseObj.put("data", nearbyUsers);
    44. return (T) responseObj;
    45. }
    46. 相关阅读:
      如何写一份出色的毕业设计任务书
      扫雷游戏(C语言)
      【微处理器】基于FPGA的微处理器VHDL开发
      ToDoList全局事件总线学习笔记
      从 Linux 其它用户复制 conda 的虚拟环境
      C# 删除图片,不影响程序运行
      计算机基础 - 二进制
      gpt-4o考场安排
      [附源码]Python计算机毕业设计安庆师范大学校园互助平台
      UVA11022 String Factoring(kmp+字符串周期+区间dp)
    47. 原文地址:https://blog.csdn.net/Cai181191/article/details/134557255
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号