Redis 实现 查找附近的人 功能

文章目录

      • 概述
      • Redis 中 Geospatial(地理位置)
      • Demo例子
      • 总结

概述

使用 Redis 实现“查找附近的人”功能,通常会依赖 Redis 的 Geo(地理位置) 数据类型来存储用户的经纬度,并基于此进行地理范围查询。Redis 通过 GEOADDGEORADIUS 等命令来存储用户位置和查找一定范围内的用户。

存储用户的地理位置:我们需要存储用户的经纬度信息,以便后续可以基于此进行地理查询。Redis 提供了 GEOADD 命令,允许将用户的经纬度信息存储在 Redis 中的有序集合中(底层基于 ZSet 实现)。

根据当前用户的位置查找附近的用户 :使用 GEORADIUSGEORADIUSBYMEMBER 命令,基于某个位置的经纬度或某个已有用户的位置,查询一定范围内的其他用户。

Redis 中 Geospatial(地理位置)

  • 描述:Redis 提供对地理位置的支持,允许存储经纬度坐标并基于此进行地理范围内的查询。
  • 常用命令
    • GEOADD key longitude latitude member:将地理空间信息添加到 key 中。
    • GEODIST key member1 member2:计算两个成员之间的距离。
    • GEORADIUS key longitude latitude radius:查询指定半径内的所有成员。
    • GEOPOS key member:返回成员的经纬度。

Demo例子

public class NearbyPeopleService {

    private Jedis jedis;

    public NearbyPeopleService() {
        // 连接 Redis
        jedis = new Jedis("localhost", 6379);
    }

    /**
     * 添加用户的地理位置信息
     *
     * @param userId    用户的唯一标识
     * @param longitude 经度
     * @param latitude  纬度
     */
    public void addUserLocation(String userId, double longitude, double latitude) {
        String key = "user_locations"; // 存储用户位置的 key
        jedis.geoadd(key, longitude, latitude, userId); // 使用 GEOADD 存储用户位置
        System.out.println("Added user location: " + userId);
    }

    /**
     * 查找附近的人
     *
     * @param longitude 当前用户的经度
     * @param latitude  当前用户的纬度
     * @param radius    查找半径
     * @return 附近的用户列表
     */
    public List<GeoRadiusResponse> findNearbyPeople(double longitude, double latitude, double radius) {
        String key = "user_locations"; // 存储用户位置的 key
        // 使用 GEORADIUS 查找附近的用户
        List<GeoRadiusResponse> nearbyPeople = jedis.georadius(key, longitude, latitude, radius, GeoUnit.KM);
        return nearbyPeople;
    }

    public static void main(String[] args) {
        NearbyPeopleService service = new NearbyPeopleService();

        // 假设有几个用户的地理位置
        service.addUserLocation("user1", 116.4074, 39.9042);  // 北京
        service.addUserLocation("user2", 121.4737, 31.2304);  // 上海
        service.addUserLocation("user3", 113.2644, 23.1291);  // 广州
        service.addUserLocation("user4", 114.0579, 22.5431);  // 深圳

        // 查找北京附近 1500 公里以内的用户
        List<GeoRadiusResponse> nearbyPeople = service.findNearbyPeople(116.4074, 39.9042, 1500);
        System.out.print("北京附近 1500 公里以内的用户:");
        for (GeoRadiusResponse response : nearbyPeople) {
            System.out.print(response.getMemberByString() + " "); // 输出附近的用户 ID
        }
    }
}

结果:
在这里插入图片描述

总结

Redis 的 Geo 功能非常适合用于处理与地理位置相关的需求,尤其是在需要高效地进行地理范围查询、距离计算或位置排序的场景中。由于 Redis 是内存存储,Geo 操作的性能通常非常高,适合需要实时处理地理数据的应用场景,如社交、物流、旅游、共享经济等领域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/890925.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatTTS在Windows电脑的本地部署与远程生成音频详细实战指南

文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 本篇文章主要介绍如何快速地在Windows系统电脑中本地部署ChatTTS开源文本转语音项目&#xff0c;并且我们还可以结合Cpolar内网穿透工具创建公网地址&#xff0c;随时随…

低代码开发技术:驱动MES系统创新与制造业数字化转型的融合之路

低代码开发与生产管理MES系统的融合&#xff0c;是当今制造业数字化转型的一个重要趋势。以下是对这一融合现象的详细分析&#xff1a; 一、低代码开发的概念与特点 低代码开发是一种通过图形化界面和预构建模块来简化应用程序开发过程的方法。它允许开发人员使用拖放组件和最…

请确保已在git上配置你的user.name和user.email

问题&#xff1a;使用vscode在远程服务器上暂存修改报错&#xff1a; 原因&#xff1a;未在远程服务器上配置该项目对应的git的username和useremail 解决方法&#xff1a; 在vscode中新建一个终端 命名&#xff1a; git config --global user.email "youexample.com&qu…

【读书笔记·VLSI电路设计方法解密】问题12:制造MOSFET晶体管的主要工艺步骤是什么

VLSI芯片是在半导体材料上制造的,这种材料的导电性介于绝缘体和导体之间。通过一种称为掺杂的工艺引入杂质,可以改变半导体的电气特性。能够在半导体材料的细小且定义明确的区域内控制导电性,促使了半导体器件的发展。结合更简单的无源元件(电阻、电容和电感),这些器件被…

【Python】Conda离线执行命令

以下链接证明了想要离线使用conda命令的方法 启用离线模式 — Anaconda documentation 基本上大部分的命令都会提供网络选项 例如creat命令 conda create — conda 24.7.1 文档 - Conda 文档

Anthropic CEO 万字长文:我认为AGI最早会在 2026 年出现,机器可以像人类一样协助办公

在 Claude AI 新模型发布之际&#xff0c;Anthropic 的CEO Dario Amodei 发表了一篇近2万字深度长文&#xff0c;探讨人工智能对人类的潜在积极影响。作为斯坦福大学神经科学博士&#xff0c;Amodei 以严谨的学术态度定义了强人工智能概念&#xff0c;并详细阐述了它在不同核心…

打破常规,BD仓储物流的效能提升!

当前&#xff0c;随着国家战略的推进&#xff0c;JS与民用领域的融合不断加深&#xff0c;物流业也步入了军民融合的新时代。在智能仓储物流方面&#xff0c;JS物流的智能化进展受到了BD系统的高度关注和重视。 一、建设JS仓储物流RFID基础设施 JS物流领域引入RFID技术的基础工…

MySQL表的基本查询上

1&#xff0c;创建表 前面基础的文章已经讲了很多啦&#xff0c;直接上操作&#xff1a; 非常简单&#xff01;下一个&#xff01; 2&#xff0c;插入数据 1&#xff0c;全列插入 前面也说很多了&#xff0c;直接上操作&#xff1a; 以上插入和全列插入类似&#xff0c;全列…

概率 期望与方差

一、期望 1、定义 对随机变量可能取值的加权平均&#xff0c;其中权重是每个可能取值的概率。用E表示&#xff0c;如x是随机变量&#xff0c;则该期望为EX 2、离散型随机变量的期望 对于离散随机变量 X &#xff0c;其可能的取值为 x1,x2,…,xn&#xff0c;对应的概率为 E(X)…

MOS管的电路应用

MOS管的电路应用 MOS管的选型参考 1、MOS管类型 一般选择增强型NMOS管&#xff0c;同等工艺条件下&#xff0c;导通电阻Ron更小&#xff0c;发热更低&#xff0c;允许通过的电流更大&#xff0c;型号也更多。 2、Vgs电压 需要考虑开启电压&#xff0c;驱动电压&#xff0c;极…

基于WebSocket实现简易即时通讯功能

代码实现 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifa…

SQL 干货 | 使用 Having 子句筛选聚合字段

如果你编写 SQL 查询已有一段时间&#xff0c;那么你可能对 WHERE 子句非常熟悉。虽然它对聚合字段没有影响&#xff0c;但有一种方法可以根据聚合值过滤记录&#xff0c;那就是使用 HAVING 子句。本博客将介绍它的工作原理&#xff0c;并提供几个在 SELECT 查询中使用它的示例…

Redis-缓存一致性

缓存双写一致性 更新策略探讨 面试题 缓存设计要求 缓存分类&#xff1a; 只读缓存&#xff1a;&#xff08;脚本批量写入&#xff0c;canal 等&#xff09;读写缓存 同步直写&#xff1a;vip数据等即时数据异步缓写&#xff1a;允许延时&#xff08;仓库&#xff0c;物流&a…

C语言练习

题目&#xff1a; 1.编写一段C语言&#xff0c;向下边这样输入2个整数&#xff0c;如果他们的差值小于等于10&#xff0c;则显示“它们的差值小于等于10”&#xff0c;否则显示“它们的差大于等于11”. 请输入两个整数&#xff1a; 整数A&#xff1a;12 整数B&#xff1a;7…

SQL分类中的DDL

DDL&#xff08;Data Definition Language):数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;。 一、DDL语句操作数据库 1、查询所有数据库&#xff1a;show databases&#xff1b;&#xff08;一般用大写&#xff…

spring |Spring Security安全框架 —— 认证流程实现

文章目录 开头简介环境搭建入门使用1、认证1、实体类2、Controller层3、Service层3.1、接口3.2、实现类3.3、实现类&#xff1a;UserDetailsServiceImpl 4、Mapper层3、自定义token认证filter 注意事项小结 开头 Spring Security 官方网址&#xff1a;Spring Security官网 开…

React路由 基本使用 嵌套路由 动态路由 获取路由参数 异步路由 根据配置文件来生成路由

文章目录 React-router的三个版本react-router使用嵌套路由动态路由 获取路由参数Params参数Query参数Location信息 控制跳转地址异步路由根据配置文件生成路由 React-router的三个版本 React-router 服务端渲染使用React-router-dom 浏览器端渲染使用React-router-native Rea…

API项目3:API签名认证

问题引入 我们为开发者提供了接口&#xff0c;却对调用者一无所知 假设我们的服务器只能允许 100 个人同时调用接口。如果有攻击者疯狂地请求这个接口&#xff0c;那是很危险的。一方面这可能会损害安全性&#xff0c;另一方面耗尽服务器性能&#xff0c;影响正常用户的使用。…

若依前后端分离版本el-select下拉框字典如何设置默认值。

在若依前后端分离框架中&#xff0c;如何给下拉框设置默认值&#xff0c;刚入门的小伙伴&#xff0c;可能会不知道如何去做。 本章教程&#xff0c;主要以用户管理模块中的添加用户举例说明如何设置用户性别默认值为男。 解决思路 首先&#xff0c;我们需要找到打开新增页面的方…

【工具】前端js数字金额转中文大写金额

【工具】前端js数字金额转中文大写金额 代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>金额转…